UI 压缩图像时正在冻结

UI is Freezing when compressing an image

我正在尝试压缩来自相机或画廊的图像,但我尝试回答这个问题

但是UI卡住了,请问你们有什么解决办法吗,为什么图片插件会遇到这个问题?

更新:

compressImage(imageFile).then((File file) {
   imageFile = file;
});

Future<File> compressImage(File imageFile) async {
   return compute(decodeImage, imageFile);
}

File decodeImage(File imageFile) {
   Im.Image image = Im.decodeImage(imageFile.readAsBytesSync());
   Im.Image smallerImage = Im.copyResize(
       image, 150); // choose the size here, it will maintain aspect ratio
   return new File('123.jpg')
     ..writeAsBytesSync(Im.encodeJpg(smallerImage, quality: 85));
}

我在这段代码中遇到了 "unhandled exception"

这是因为压缩是在 UI 线程中完成的。

您可以使用 compute() https://docs.flutter.io/flutter/foundation/compute.html

将计算移动到新线程

非UI 线程的功能当前存在严重限制。

  • 如果传递图像数据,它会从一个线程复制到另一个线程,这可能会很慢。如果您在文件中有图像,就像您从 image_picker 获取图像一样,最好传递文件路径并在新线程中读取图像。

  • 您只能传递可以编码为JSON的值(它实际上不是编码为JSON,但它支持相同的类型)

  • 您不能使用插件。这意味着您需要通过传递数据(再次复制)或写入文件并将文件路径传回,将压缩数据移回 UI 线程,但在这种情况下,复制可能是更快,因为在一个线程中写入文件而在另一个线程中读取它甚至更慢)。 然后,您可以在 UI 线程中调用图像上传到 Firebase 云存储,但因为这是一个插件,所以它会在本机代码中 运行 而不是在 UI 线程中。只是 UI 线程需要传递图像。