You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:53:24