我通过套接字接收了字节数组中的位图,然后我读了它,然后我想在我的应用程序中将它os.toByteArray
设置为ImageView
。我使用的代码是:
try {
//bmp = BitmapFactory.decodeByteArray(result, 0, result.length);
bitmap_tmp = Bitmap.createBitmap(540, 719, Bitmap.Config.ARGB_8888);
ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());
bitmap_tmp.copyPixelsFromBuffer(buffer);
Log.d("Server",result+"Length:"+result.length);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap_tmp);
}
});
return bmp;
} finally {
}
当我运行我的应用程序并开始接收Byte[]
并期望更改ImageView
时,它不会。
LogCat 说:
java.lang.RuntimeException: Buffer not large enough for pixels at
android.graphics.Bitmap.copyPixelsFromBuffer
我搜索了类似的问题,但无法找到解决问题的方法。
答案 0 :(得分:7)
查看Bitmap::copyPixelsFromBuffer()
的源(版本2.3.4_r1,上次在4.4之前的Grepcode上更新了Bitmap)错误的措辞有点不清楚,但代码澄清了 - 这意味着您的缓冲区计算为没有足够的数据来填充位图的像素。 这是(可能)因为它们使用缓冲区的remaining()方法来计算缓冲区的容量,该方法考虑了其position属性的当前值。如果在调用copyFromPixels()之前在缓冲区上调用rewind(),则可能会看到运行时异常消失。我说'可能'因为ByteBuffer :: wrap()方法应该将position属性值设置为零,不需要调用rewind,但是根据类似的问题来判断,我自己的经验明确地重置位置可能会有所帮助。
尝试
ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());
buffer.rewind();
bitmap_tmp.copyPixelsFromBuffer(buffer);
答案 1 :(得分:1)
缓冲区大小应恰好为1553040B(假设位图的高度,宽度和32位可对每种颜色进行编码)。