Dart中Bitmap转PNG时Image.fromBytes出现数据越界错误排查
问题分析与修复方案
问题根源
你碰到的RangeError是因为Image.fromBytes默认把输入数据当成RGB三通道格式(每个像素占3字节),但你提供的是单通道灰度数据(每个像素仅1字节)。
对32×32的图像来说:
- RGB格式需要的总字节数是
32×32×3 = 3072 - 你只提供了1024字节的灰度数据,库在尝试读取更多字节时就会超出你的Uint8List范围,触发越界错误。
修复代码
调用Image.fromBytes时,显式指定format参数为Format.luminance,告诉库这是单通道灰度数据:
Uint8List uintList = Uint8List.fromList(expandedBits); print("prior to fromBytes ${width}, ${height}= ${width*height} vs ${uintList.length} vs ${uintList.lengthInBytes}"); // 关键:指定单通道灰度格式 Image image = Image.fromBytes( width: width, height: height, bytes: uintList.buffer, format: Format.luminance, );
关于索引1056的疑问
当库按默认RGB格式处理时,会按3字节/像素的规则读取数据。当它尝试读取第352个像素时(352×3=1056),你的Uint8List只有1024字节,此时访问索引1056就会超出范围,所以触发了这个错误。
导出PNG
修复后,你可以用encodePng方法把生成的Image转成PNG字节,再写入文件:
import 'dart:io'; import 'package:image/image.dart' as img; // 生成image对象后执行以下代码 List<int> pngBytes = img.encodePng(image); File('output.png').writeAsBytesSync(pngBytes);
内容的提问来源于stack exchange,提问作者Noh Kumado
相关产品推荐
相关产品推荐

