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

WWJ*_*WJD 3 java android bitmap

我通过socket接收的字节数组位图,我读了它,然后我想将其设置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 {
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序并开始接收Byte[]并期望ImageView更改时,它不是.

LogCat说:

java.lang.RuntimeException: Buffer not large enough for pixels at
android.graphics.Bitmap.copyPixelsFromBuffer
Run Code Online (Sandbox Code Playgroud)

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

CCJ*_*CCJ 7

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

错误的措辞有点不清楚,但代码澄清 - 这意味着您的缓冲区计算为没有足够的数据来填充位图的像素.这是(可能)因为它们使用缓冲区的remaining()方法来计算缓冲区的容量,该方法考虑了其position属性的当前值.如果在调用copyFromPixels()之前在缓冲区上调用rewind(),则可能会看到运行时异常消失.我说'可能'因为ByteBuffer :: wrap()方法应该将position属性值设置为零,不需要调用rewind,但是根据类似的问题判断我自己的经验明确地重置位置可能会有所帮助.

尝试

ByteBuffer buffer = ByteBuffer.wrap(os.toByteArray());
buffer.rewind();
bitmap_tmp.copyPixelsFromBuffer(buffer);
Run Code Online (Sandbox Code Playgroud)

  • 没工作的家伙。我的缓冲区大小=921600。还不够吗? (2认同)