RuntimeException:缓冲区不足以容纳像素

时间:2014-03-04 09:01:13

标签: java android bitmap

我通过套接字接收了字节数组中的位图,然后我读了它,然后我想在我的应用程序中将它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

我搜索了类似的问题,但无法找到解决问题的方法。

2 个答案:

答案 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位可对每种颜色进行编码)。