如何在不引用文件的情况下从图像中获取字节数据

Posted

技术标签:

【中文标题】如何在不引用文件的情况下从图像中获取字节数据【英文标题】:How to get ByteData from Image without referencing a file 【发布时间】:2020-04-30 06:12:01 【问题描述】:

有几种方法可以从网络图像或文件中检索 ByteData,但是我还没有找到一种可以将内存(或缓存)中的现有图像转换为 ByteData 的方法。

具体指:

var resizedImage = ResizeImage(img.image, height: 28, width: 28);

例如,以下两个答案都假设有一个文件:

How to load Image widgets from ByteData in Flutter

How to get a Flutter Uint8List from a Network Image?

dart.ui 中有一个 toByteData 方法,但这也需要图像来自原始数据。

根据 ResizeImage 文档,它存储在缓存中,但如果不使用缓存管理器,我无法访问它。

缓存的图像将被直接解码并以宽度和高度定义的分辨率存储。如果将图像大小调整为小于原始大小,图像将丢失细节并使用更少的内存。

我已经使用 path_provider 来获取临时目录,但是在执行 resize image 时它似乎是空的。无论如何在路径中没有图像的情况下将图像转换为 ByteData 吗?

【问题讨论】:

【参考方案1】:

尝试解析调整后图像的图像提供程序:

  resizedImage.imageProvider
      .resolve(createLocalImageConfiguration(context))
      .addListener(ImageStreamListener((info, _) 
        var bingo = info.image.toByteData();
  ));

【讨论】:

谢谢,这提供了 Uint8List,但是,我得到“无法实例化图像编解码器”。例外。进一步检查,原始图像列表长度为 28597(28 字节)(800x600 像素),而调整大小的一个(28x28)像素为 960000(0.96 MB),因此看起来调整大小功能没有提供正确的图像。我使用以下内容: var resizedImage = ResizeImage(img.image, height: 28, width: 28);不确定转换问题是什么,但它在调整大小。非常感谢您的回复,但是为图像提供者的解析器设置侦听器意味着什么? 如果您只想制作缩略图,请查看图像包。不要忘记 toByteData 的可选参数——你可能需要 PNG,而不是 rgba 的默认值。图像提供者必须允许异步 io 和图像解析,所以这是一个异步的想法。它还可以处理超过一帧的动画 GIF。这就是为什么您添加一个侦听器,以便在图像流准备好时收到通知。 好吧,让我试试看。重点是从内存或相机中获取图像,调整它的大小,以便机器学习模型可以使用它进行分类。我将尝试使用 toByteData 参数并查看其他文件的输出。再次感谢!

以上是关于如何在不引用文件的情况下从图像中获取字节数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 OutOfMemory 错误的情况下从 FileInputStream 获取字节数组

有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?

在 Xamarin.Forms 中获取图像或 ImageSource 的字节 [] / 流?

是否有可能在不快速调用 API 的情况下从互联网获取图像?

如何在不刷新页面的情况下从数据库中的textarea添加数据[重复]

如何在不使用 ImageView 的情况下从 API 端点下载图像或位图?