在 flutter/dart-ui 中将 UInt8List 转换为 Image

Ren*_*ujo 5 dart flutter

我有这样的场景,我必须从这样的图像中获取 UInt8List :

List stuff = image.toByteData().buffer.asUInt8List()
Run Code Online (Sandbox Code Playgroud)

做一些操作并回到Image

我尝试了以下方法:

List stuff = image.toByteData().buffer.asUInt8List()
ui.decodeImageFromList(stuff, (image){
  // do stuff with image
});
Run Code Online (Sandbox Code Playgroud)

但我不断收到此异常:

E/flutter (10201): [ERROR:flutter/lib/ui/painting/codec.cc(97)] Failed decoding image. Data is either invalid, or it is encoded using an unsupported format.
E/flutter (10201): [ERROR:flutter/shell/common/shell.cc(186)] Dart Error: Unhandled exception:
...
Run Code Online (Sandbox Code Playgroud)

请注意,即使列表中没有任何更改,也会引发异常。如何使列表具有可编码格式?

Kis*_*nga 12

您可以使用下面给出的内存图像,用于直接字节渲染

child: Image.memory(Uint8List bytes);
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于从“ui.Image”实例生成的 Uint8List (2认同)

Ric*_*eap 5

ui.Image可以将其自身转换为 RGBA 位图(或 PNG),但无法将其自身从位图转换回来。(原因是没有任何方法可以告诉图像编解码器诸如颜色深度、几何形状等信息。)解决方案是将 BMP 文件头添加到位图的前面,您可以在其中描述这些信息缺少东西,然后将其传递给instantiateImageCodec. 请参阅此答案,但请注意,在这种情况下,相关位图有一个奇怪的打包颜色图。对于 32 位 RGBA,标头会更简单。

  • 在得到这个答案之后,我开始做一些事情来让这件事变得更容易。我正在将 Uint8List 转换为带有位图的图像,这是我制作的一个包。谢谢。https://github.com/renancaraujo/bitmap/ (4认同)

Fir*_*van 5

您可以使用 MemoryImage 类将 Uint8List 转换为图像。

var _image = MemoryImage(image);

您可以在此处找到有关该课程的更多详细信息


Ali*_*eri 5

用这个。

static Future<ui.Image> bytesToImage(Uint8List imgBytes) async{
    ui.Codec codec = await ui.instantiateImageCodec(imgBytes);
    ui.FrameInfo frame;
    try {
      frame = await codec.getNextFrame();
    } finally {
      codec.dispose();
    }
    return frame.image;
  }
Run Code Online (Sandbox Code Playgroud)

  • 需要导入 `import 'dart:ui' as ui;` (3认同)