2010-12-14 9 views
46

私はImageViewのウェブからの画像を持っています。それは非常に小さく(favicon)、私はSQLiteデータベースに保存したいと思います。 私はDrawablemImageView.getDrawable()から得ることができますが、次に何をすべきかわかりません。私はAndroidのDrawableクラスを完全に理解していません。図形をバイト[]

私は同じようBitmapからバイト配列を取得することができます知っている:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
defaultIcon.compress(Bitmap.CompressFormat.JPEG, 100, stream); 

byte[] bitmapdata = stream.toByteArray(); 

しかし、どのように私はDrawableからバイト配列を得るのですか?今画像をByteArrayの中に保存されている

答えて

110
Drawable d; // the drawable (Captain Obvious, to the rescue!!!) 
Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitmapdata = stream.toByteArray(); 
+0

が明らかいただきありがとうございますを!それをキャスティングすることを考えなかった。 –

+9

これは次のとおりです。bitmap.compress(Bitmap.CompressFormat.JPEG、100、stream);それ以外の場合、ストリームにはデータが含まれていません。 – Entreco

+0

@Cristian私はBLOBとしてデータベースにbitmapdataを保存しました。再びBLOBからドロウアブルを取り戻すと、背景が黒くなります。あなたは私を助けることができますか?私はバックグラウンドをデータベースに保存する前と同じように透明にしたい。 –

-2
File myFile = new File(selectedImagePath); 

byte [] mybytearray = new byte [filelenghth]; 

BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(myFile)); 

bis1.read(mybytearray,0,mybytearray.length); 

..

18

おかげで、すべて、これが私の問題を解決しました。

Resources res = getResources(); 
Drawable drawable = res.getDrawable(R.drawable.my_pic); 
Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

BLOBからデータベースにbitMapDataを保存しました。また、BLOBからdrawableを取り戻すと背景が黒くなります。あなたは私を助けることができますか?私はバックグラウンドをデータベースに保存する前と同じように透明にしたい。 –

+0

私はそのプロセスと並行して起こる別の問題だと思います。再現して確認するための詳細を提供できる場合は、その素晴らしいです。 – Randula

+1

JPEG形式で保存すると起こっていましたが、PNGに変更しました。 –

5
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tester); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] bitMapData = stream.toByteArray(); 
+0

これは2年前から受け入れられた答えのマイナーなようです... – Sam

+0

これは良い答えです。 BitmapDrawableにキャストする必要があります.Drawableは実際にはインスタンスではない可能性があります。 –

+0

@mattsniderありがとう – Kalpesh

0

Drawableのは、あなたがこれを試すことができBitmapDrawableある場合。ビットマップのピクセルの行の間のバイト数を返す

long getSizeInBytes(Drawable drawable) { 
    if (drawable == null) 
     return 0; 

    Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 
    return bitmap.getRowBytes() * bitmap.getHeight(); 
} 

Bitmap.getRowBytes()。

よりこのプロジェクト参照してください:LazyList

+1

この投稿はコードだけであるため、自動的に低品質のフラグが付けられています。問題をどのように解決するかを説明するテキストを追加して拡張してもよろしいですか? – gung