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

Android:将可绘制图像转换为字节数组时的一些问题,android,bytearray,Android,Bytearray,我想将应用程序中的图像转换为Base64编码字符串。此图像可以是任何类型,如jpeg、png等 我所做的是,我把绘图转换成位图。然后,我使用压缩方法将此位图转换为ByteArrayOutputStream,并将此ByteArrayOutputStream转换为字节数组。然后我使用encodeToString()将其编码为Base64 如果图像是PNG或JPEG格式,我可以使用上述方法显示图像 ByteArrayOutputStream objByteOutput = new ByteArrayO

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

我所做的是,我把绘图转换成位图。然后,我使用压缩方法将此位图转换为ByteArrayOutputStream,并将此ByteArrayOutputStream转换为字节数组。然后我使用encodeToString()将其编码为Base64

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

ByteArrayOutputStream objByteOutput = new ByteArrayOutputStream();
 imgBitmap.compress(CompressFormat.JPEG, 0, objByteOutput);
但问题是,如果图像是PNG或JPEG以外的任何其他类型,如何显示图像

或者请建议我从位图中获取字节数组的其他方法

谢谢…

我建议使用

并指定一个ByteBuffer,然后可以在ByteBuffer上使用.array()(如果实现了它)(这是一个可选方法),或者在.array()不存在的情况下使用.get(byte[])来获取它

更新:

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

您可以通过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);

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

如果您的问题是在Android中显示图像,我认为唯一支持的格式是jpg、png和gif,因此其他s格式不起作用是合乎逻辑的。。。我猜是转换成位图把事情搞砸了。查看压缩方法的代码并尝试复制它以接受任何类型的文件?感谢zeetoobiker的帮助。。我试过使用ByteBuffer,但我得到了一个异常“缓冲区不够大,无法容纳像素”。我将缓冲区容量设置为imgBitmap.getHeight()*imgBitmap.getWidth()。然后我也得到了同样的例外。我们怎么知道应该初始化的excat缓冲区大小是多少?您是用整数计算的,而不是要使用位图的字节数。getByteCount()作为宽度*高度实际上是每个像素的字节数的倍数(具体取决于格式),以了解它的实际大小。但是getByteCount()仅受12级以后的API支持。我只使用API级别8,很抱歉,我本应该读到它引入得太晚了。好的,答案可能与getRowBytes()有关,但我不完全确定如何-我建议只乘以4,因为这是从Color类中我能看出的最大值(argb-每个字节一个),“组件存储如下(alpha-BitmapCompat.getAllocationByteCount(位图);