【问题标题】:RuntimeException: Buffer not large enough for pixelsRuntimeException:缓冲区不足以容纳像素
【发布时间】:2014-03-04 09:01:12
【问题描述】:

我通过套接字接收字节数组中的位图并读取它,然后我想在我的应用程序中将其设置为os.toByteArrayImageView。我使用的代码是:

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

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

【问题讨论】:

  • 你的安卓操作系统版本是多少?
  • 图像字节的尺寸是否与您的位图 (540x719) 相同?
  • 不需要用ByteBuffer.allocate设置缓冲区大小吗?
  • 我使用的是 4.1.2(API 级别 16)。
  • @Henry 是的。 byte[] 的长度为 540*719*4。

标签: java android bitmap


【解决方案1】:

查看Bitmap::copyPixelsFromBuffer() 的源代码(版本 2.3.4_r1,上次 Bitmap 在 4.4 之前的 Grepcode 上更新)

错误的措辞有点不清楚,但代码澄清了 - 这意味着您的缓冲区被计算为没有足够的数据来填充位图的像素。 这是(可能)因为他们使用缓冲区的剩余()方法来计算缓冲区的容量,该容量考虑了其位置属性的当前值。如果在调用 copyFromPixels() 之前在缓冲区上调用 rewind(),您可能会看到运行时异常消失。我说“可能”是因为 ByteBuffer::wrap() 方法应该将位置属性值设置为零,从而无需调用 rewind,但从类似的问题和我自己的经验来看,明确地重置位置可能会奏效。

试试

ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());
buffer.rewind();
bitmap_tmp.copyPixelsFromBuffer(buffer);

【讨论】:

  • 没工作的家伙。我的缓冲区大小=921600。还是不够?
【解决方案2】:

缓冲区大小应该正好是 1553040B(假设位图的高度、宽度和 32 位来编码每种颜色)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2011-02-09
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多