如何在 Dart 中将 RGB 像素图转换为 ui.Image?
How to convert RGB pixmap to ui.Image in Dart?
目前我有一个 Uint8List,格式为 [R,G,B,R,G,B,...] 用于图像的所有像素。当然我有它的宽度和高度。
我在搜索时找到了 decodeImageFromPixels
,但它只需要 RGBA/BGRA 格式。我将我的像素图从 RGB 转换为 RGBA,这个函数工作正常。
但是,我的代码现在看起来像这样:
Uint8List rawPixel = raw.value.asTypedList(w * h * channel);
List<int> rgba = [];
for (int i = 0; i < rawPixel.length; i++) {
rgba.add(rawPixel[i]);
if ((i + 1) % 3 == 0) {
rgba.add(0);
}
}
Uint8List rgbaList = Uint8List.fromList(rgba);
Completer<Image> c = Completer<Image>();
decodeImageFromPixels(rgbaList, w, h, PixelFormat.rgba8888, (Image img) {
c.complete(img);
});
我必须制作一个新列表(在 space 中浪费)并遍历整个列表(浪费时间)。
我觉得这太低效了,有什么办法可以让它更优雅吗?想添加一个新的 PixelFormat.rgb888
?
提前致谢。
您可能会发现此循环更快,因为它不会一直附加到列表,然后在最后复制它。
final rawPixel = raw.value.asTypedList(w * h * channel);
final rgbaList = Uint8List(w * h + 4); // create the Uint8List directly as we know the width and height
for (var i = 0; i < w * h; i++) {
final rgbOffset = i * 3;
final rgbaOffset = i * 4;
rgbaList[rgbaOffset] = rawPixel[rgbOffset]; // red
rgbaList[rgbaOffset + 1] = rawPixel[rgbOffset + 1]; // green
rgbaList[rgbaOffset + 2] = rawPixel[rgbOffset + 2]; // blue
rgbaList[rgbaOffset + 3] = 255; // a
}
另一种方法是通过调整 this answer(虽然它会更简单,因为没有调色板)并将该位图传递给 instantiateImageCodec
,因为该代码大概是针对解析位图进行了高度优化。
目前我有一个 Uint8List,格式为 [R,G,B,R,G,B,...] 用于图像的所有像素。当然我有它的宽度和高度。
我在搜索时找到了 decodeImageFromPixels
,但它只需要 RGBA/BGRA 格式。我将我的像素图从 RGB 转换为 RGBA,这个函数工作正常。
但是,我的代码现在看起来像这样:
Uint8List rawPixel = raw.value.asTypedList(w * h * channel);
List<int> rgba = [];
for (int i = 0; i < rawPixel.length; i++) {
rgba.add(rawPixel[i]);
if ((i + 1) % 3 == 0) {
rgba.add(0);
}
}
Uint8List rgbaList = Uint8List.fromList(rgba);
Completer<Image> c = Completer<Image>();
decodeImageFromPixels(rgbaList, w, h, PixelFormat.rgba8888, (Image img) {
c.complete(img);
});
我必须制作一个新列表(在 space 中浪费)并遍历整个列表(浪费时间)。
我觉得这太低效了,有什么办法可以让它更优雅吗?想添加一个新的 PixelFormat.rgb888
?
提前致谢。
您可能会发现此循环更快,因为它不会一直附加到列表,然后在最后复制它。
final rawPixel = raw.value.asTypedList(w * h * channel);
final rgbaList = Uint8List(w * h + 4); // create the Uint8List directly as we know the width and height
for (var i = 0; i < w * h; i++) {
final rgbOffset = i * 3;
final rgbaOffset = i * 4;
rgbaList[rgbaOffset] = rawPixel[rgbOffset]; // red
rgbaList[rgbaOffset + 1] = rawPixel[rgbOffset + 1]; // green
rgbaList[rgbaOffset + 2] = rawPixel[rgbOffset + 2]; // blue
rgbaList[rgbaOffset + 3] = 255; // a
}
另一种方法是通过调整 this answer(虽然它会更简单,因为没有调色板)并将该位图传递给 instantiateImageCodec
,因为该代码大概是针对解析位图进行了高度优化。