Android:将可绘制图像转换为字节数组时出现一些问题

时间:2011-09-29 07:47:53

标签: android bytearray

我想将应用中的图片转换为Base64编码的字符串。此图像可以是任何类型,如jpeg,png等。

我所做的是,我将drawable转换为Bitmap。然后我使用compress metheod将此Bitmap转换为ByteArrayOutputStream并且我将此ByteArrayOutputStream转换为字节数组。然后我使用encodeToString()将其编码为Base64。

如果图像是PNG或JPEG,我可以使用上述方法显示图像。

ByteArrayOutputStream objByteOutput = new ByteArrayOutputStream();
 imgBitmap.compress(CompressFormat.JPEG, 0, objByteOutput);

但问题是如果图像是除PNG或JPEG以外的任何其他类型,我该如何显示图像?

或者请建议我从Bitmap获取字节数组的另一种方法。

谢谢...

1 个答案:

答案 0 :(得分:1)

我建议使用

http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer)

并指定一个ByteBuffer,然后你可以在ByteBuffer上使用.array()(如果它是一个可选方法)或.get(byte [])来获取它,如果.array()不存在的话。

更新

为了确定要创建的缓冲区的大小,您应该使用Bitmap.getByteCount()。但是这仅出现在API 12及更高版本上,因此您需要使用Bitmap.getWidth()* Bitmap.getHeight()* 4 - 4的原因是Bitmap使用一系列像素(内部表示可能更少)但不应该更多),每个都是一个ARGB值0-255因此4 bytes per pixel

您可以使用Bitmap.getHeight()* Bitmap.getRowBytes()获得相同的内容 - 这里是我用来验证此工作的一些代码:

            BitmapDrawable bmd = (BitmapDrawable) getResources().getDrawable(R.drawable.icon);
            Bitmap bm = bmd.getBitmap();
            ByteBuffer byteBuff = ByteBuffer.allocate(bm.getWidth() * bm.getHeight() * 4);
            byteBuff.rewind();
            bm.copyPixelsToBuffer(byteBuff);
            byte[] tmp = new byte[bm.getWidth() * bm.getHeight() * 4];
            byteBuff.rewind();
            byteBuff.get(tmp);

这不是很好的代码,但它会将字节数组输出。