开发者

Android : some problems when converting drawable image to byte array

I want to convert an image in my app to a Base64 encod开发者_JAVA技巧ed string. This image may be of any type like jpeg, png etc.

What I have done is, I converted the drawable to a Bitmap. Then I converted this Bitmap to ByteArrayOutputStream using compress metheod And I am converting this ByteArrayOutputStream to byte array. And then I am encoding it to Base64 using encodeToString().

I can display the image using the above method if the image is of PNG or JPEG.

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

But the problem is if the image is in any other types than PNG or JPEG, how can I display the image?

Or please suggest me some another method to get byte array from Bitmap.

Thank you...


I'd suggest using

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

and specify a ByteBuffer, then you can use .array() on the ByteBuffer if it is implemented (it's an optional method) or .get(byte[]) to get it if .array() doesn't exist.

Update:

In order to determine the size of the buffer to create you should use Bitmap.getByteCount(). However this is only present on API 12 and up, so you would need to use Bitmap.getWidth()*Bitmap.getHeight()*4 - the reason for 4 is that the Bitmap uses a series of pixels (internal representation may be less but shouldn't ever be more), each being an ARGB value with 0-255 hence 4 bytes per pixel.

You can get the same with Bitmap.getHeight() * Bitmap.getRowBytes() - here's some code I used to verify this worked:

            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);

It's not nice code, but it gets the byte array out.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜