2011-09-09 14 views
9

私のアプリ用の最小ターゲットSDKが4に設定されている場合、Drawable.createFromStreamのすべての呼び出しがサイズ変更されます。サイズ変更せずにストリームからDrawableを作成する方法は?

ソース画像が480PX広く、私のアプリを実行しているAndroidデバイスは、1.5の密度を有している場合、次のコードは不変であることを強制する方法はあります320

URL url = new URL("http://www.examples.com/something.png"); 

Drawable d = Drawable.createFromStream(url.openStream(), "something.png"); 

の幅BitmapDrawableを返しますまたはInputStreamから画像を返すためのスケール(ldpi/mdpi/hdpi etC)を指定しますか?

編集:下記の解決策:

Bitmap b = BitmapFactory.decodeStream(inputStream); 
b.setDensity(Bitmap.DENSITY_NONE); 
Drawable d = new BitmapDrawable(b); 

答えて

8

イメージをビットマップとして読み込むことができます。この方法では、サイズは変更されません。

BitmapFactory.decodeStream(...) 

また、BitmapDrawable(InputStream is)コンストラクタを試すこともできます。それは非難されますが、私はそれが仕事をするべきだと思います。

+0

私は 'BitmapDrawable()'メソッドを使って、ポイントにまっすぐ進むことができます。理想的には、BitmapDrawable(Resource、InputStream) 'を使用しますが、APIレベル5まで使用できません。もう1つのオプションは、' BitmapDrawable(Resource、new BitmapFactory() .decodeStream(InputStream)) 'はAPIレベル4で利用できます(それ以下ではありません)。 – DeeV

+0

これはありがとうございます。 BitmapDrawableに変換する方法を示す編集を追加しました。 – Johnny

1

長い間、私は次の解決策を見つけました。できます。 locallinkでファイルからビットマップを作成します。 ImageViewのアダプタでローカルリソースから

private Drawable getDrawableForStore(String localLink) { 
    Bitmap thumbnail = null; 
    try { 
     File filePath = this.getFileStreamPath(localLink); 
     FileInputStream fi = new FileInputStream(filePath); 
     thumbnail = BitmapFactory.decodeStream(fi); 
    } catch (Exception ex) { 
     Log.e("getThumbnail() on internal storage", ex.getMessage()); 
     return null; 
    } 

    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    float scaledDensity = metrics.density; 
    int width = thumbnail.getWidth(); 
    int height = thumbnail.getHeight(); 

    if(scaledDensity<1){ 

     width = (int) (width *scaledDensity); 
     height = (int) (height *scaledDensity); 
    }else{ 
     width = (int) (width +width *(scaledDensity-1)); 
     height = (int) (height +height *(scaledDensity-1)); 
    } 

    thumbnail = Bitmap.createScaledBitmap(thumbnail, width, height, true); 
    Drawable d = new BitmapDrawable(getResources(),thumbnail); 

    return d; 

} 
1

読み込み画像

Iは、リソースフォルダからロードし、2枚の画像と低いため、コウシクDuttaさんによってイオンでOOMエラーで貼り付けました。たとえ彼らがデータのストリームではないために起こるかもしれないと彼は言いました。それらをInputStreamとしてロードするように提案しました。

私はローカルからわずか4枚の画像が必要だったので、イオンライブラリをチャックしました。

ここでは単純なImageViewを使用したソリューションです。 RecyclerViewAdapter /又は任意

InputStream inputStream = mContext.getResources().openRawResource(R.drawable.your_id); 

    Bitmap b = BitmapFactory.decodeStream(inputStream); 
    b.setDensity(Bitmap.DENSITY_NONE); 
    Drawable d = new BitmapDrawable(b); 
    holder.mImageView.setImageDrawable(d); 

が、描画領域D =新しいBitmapDrawable(b)は内部

は廃止されましたが、その仕事は非常にうまくいきます。

ので、代わりに私たちは直接

Drawable d = Drawable.createFromStream(inputStream,"src"); 

はそれがお役に立てば幸いです。..ちょうどこのラインでのInputStreamから引き出し可能を得ることができます。

+0

tnx +1の投票権 –