java - 运行时异常 : Buffer not large enough for pixels

标签 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

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

最佳答案

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

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

尝试

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

关于java - 运行时异常 : Buffer not large enough for pixels,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22167192/

相关文章:

java - ObjectOutputStream - 超过 1GB 的对象导致 java.lang.OutOfMemoryError : Requested array size exceeds VM limit

java - 使用编程资源注册的 Jersey 异步请求处理

java - 生成 p :tabs from Java List

c# - 在位图上绘制长字符串会导致绘制问题

Android - 在 TouchImageView 上使用位图绘制线条

java - Web 应用程序中的 Jboss Drools

android - 如何以编程方式断开android 4.1.2 nexus中的调用

android - 如何使用 CursorWrapper 过滤 Cursor 行

java - 此 Android SDK 需要 Android Developer Toolkit -887826。请更新ADT到最新版本

c++ - 如何将这个新的 char** 写入 .bmp 文件?