可绘制到字节[]
Posted
技术标签:
【中文标题】可绘制到字节[]【英文标题】:Drawable to byte[] 【发布时间】:2011-05-25 01:30:18 【问题描述】:我在ImageView
中有一张来自网络的图片。它非常小(一个图标),我想将它存储在我的 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
获取字节数组?
【问题讨论】:
【参考方案1】: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();
【讨论】:
谢谢你的明显!!没有考虑过投射它。 应该是:bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);否则流不包含数据... @Cristian 我将数据库中的位图数据保存为 BLOB,当我再次从 BLOB 重新获得可绘制对象时,背景变为黑色。你能帮我吗?我希望背景透明,就像保存到数据库之前一样。 @Hissain,因为 JPG 不存储透明度,因此您需要 PNG 注意:在大多数情况下,用 90(而不是 100)压缩 JPEG 是最好的方法!【参考方案2】:谢谢大家,这解决了我的问题。
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();
【讨论】:
我在数据库中将 bitMapData 保存为 BLOB,当我再次从 BLOB 中恢复我的可绘制对象时,背景变为黑色。你能帮我吗?我希望背景透明,就像保存到数据库之前一样。 我认为这是一个与该过程并行发生的不同问题。如果您可以提供更多详细信息以进行复制和检查,那就太好了。 使用 JPEG 格式保存时会发生这种情况,但我更改为 PNG,它工作正常...【参考方案3】:Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tester);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] bitMapData = stream.toByteArray();
【讨论】:
这是一个更好的答案,因为它不需要强制转换为 BitmapDrawable,drawable 实际上可能不是它的一个实例。 @mattsnider 谢谢【参考方案4】:如果 Drawable 是 BitmapDrawable 你可以试试这个。
long getSizeInBytes(Drawable drawable)
if (drawable == null)
return 0;
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
return bitmap.getRowBytes() * bitmap.getHeight();
Bitmap.getRowBytes() 返回位图像素中各行之间的字节数。
更多信息请参考这个项目:LazyList
【讨论】:
这篇文章被自动标记为低质量,因为它只是代码。您介意通过添加一些文本来解释它如何解决问题来扩展它吗?【参考方案5】:File myFile = new File(selectedImagePath);
byte [] mybytearray = new byte [filelenghth];
BufferedInputStream bis1 = new BufferedInputStream(new FileInputStream(myFile));
bis1.read(mybytearray,0,mybytearray.length);
现在图像存储在字节数组中..
【讨论】:
以上是关于可绘制到字节[]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 jpeg 或 png 格式的字节数组在画布上绘制图像
启动 Xamarin.forms 应用程序时出错:尝试绘制太大(165514752 字节)位图