2010-12-14 54 views
46

我从网上有一个图像在ImageView。它非常小(favicon),我想将它存储在我的SQLite数据库。 我可以从mImageView.getDrawable()得到Drawable,但我不知道接下来要做什么。我不完全了解Android中的Drawable类。可以绘制为字节[]

我知道我可以从Bitmap就像一个字节数组:

Bitmap defaultIcon = BitmapFactory.decodeStream(in); 

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

byte[] bitmapdata = stream.toByteArray(); 

但是我如何才能从Drawable的字节数组?

回答

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

谢谢大家了!明显没想过要投它。 – 2010-12-15 00:01:41

+9

应该是:bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);否则流不包含数据... – Entreco 2011-09-07 09:54:30

+0

@Cristian我将数据库中的bitmapdata保存为BLOB,当我从BLOB中恢复我的drawable时,背景变成黑色。你能帮我吗?我希望背景透明,因为它保存到数据库之前。 – 2014-09-12 10:29:53

-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

我把数据库中的bitMapData保存为BLOB,当我从BLOB中恢复我的drawable时,背景变成黑色。你能帮我吗?我希望背景透明,因为它保存到数据库之前。 – 2014-09-12 10:30:14

+0

我认为它是与该过程并行发生的另一个问题。它很棒,如果你能提供更多的细节来重现和检查。 – Randula 2014-09-20 18:42:04

+1

这是发生在JPEG格式保存时,但我改为PNG其工作正常... – 2014-09-21 04:47:06

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

这似乎是从两年前接受的答案未成年人... – Sam 2012-07-16 21:39:06

+0

这是一个更好的答案,因为它doesn' t需要转换为BitmapDrawable,其中drawable可能实际上不是实例。 – 2016-04-29 21:11:43

+0

@mattsnider谢谢 – Kalpesh 2016-05-09 09:54:04

0

如果绘制对象是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 2014-06-13 15:04:42

相关问题