ByteBuffer转Bitmap崩溃:缓冲空间不足无法填充像素问题
解决Bitmap转换时“缓冲空间不足以容纳像素”的异常
问题原因
你创建的ARGB_8888格式480×640 Bitmap需要的总字节数是480*640*4=1228800,但通过Arrays.copyOfRange(bytes,745488,1228800)得到的temp数组长度仅为1228800-745488=483312,远小于Bitmap所需的字节数,导致copyPixelsFromBuffer时缓冲空间不足。
修复方案
方案1:确保截取的字节数组长度匹配Bitmap需求
确认图片数据在原bytes数组中的正确起始位置,让截取后的temp数组长度刚好等于480*640*4。示例代码:
int requiredSize = 480 * 640 * 4; int startOffset = // 填写图片数据在bytes数组中的正确起始索引 byte[] temp = Arrays.copyOfRange(bytes, startOffset, startOffset + requiredSize); Bitmap bitmap = Bitmap.createBitmap(480,640, Bitmap.Config.ARGB_8888); ByteBuffer buffer = ByteBuffer.wrap(temp); bitmap.copyPixelsFromBuffer(buffer); imageView.setImageBitmap(bitmap);
方案2:使用BitmapFactory直接解码字节数组(更推荐)
如果原字节数组是标准图片格式(如JPEG、PNG),无需手动处理像素缓冲,直接用BitmapFactory.decodeByteArray更简单可靠:
// 替换startOffset和imageDataLength为实际的图片数据起始位置和长度 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, startOffset, imageDataLength); if (bitmap != null) { imageView.setImageBitmap(bitmap); }
额外注意事项
- 确认原字节数组中的图片数据格式与你指定的
Bitmap.Config.ARGB_8888一致,若为RGB_565等其他格式,需调整Bitmap配置,避免字节数不匹配。 - 处理大图片时注意内存占用,必要时进行压缩,防止内存溢出。
内容的提问来源于stack exchange,提问作者Terry
相关产品推荐
相关产品推荐

