我正在尝试从相机或图库压缩图像,但我尝试在这个问题中回答Flutter & Firebase: Compression before upload 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));
}
我在这段代码中遇到“未处理的异常”
答案 0 :(得分:3)
这是因为压缩是在UI线程中完成的。
您可以使用compute()
https://docs.flutter.io/flutter/foundation/compute.html
目前存在严重的限制,非UI线程可以做什么。
如果传递图像数据,则会将其从一个线程复制到另一个线程,这可能很慢。如果您将图像放在文件中,就像从image_picker
获取图像一样,最好传递文件路径并在新线程中读取图像。
您只能传递可以编码为JSON的值(它实际上并未编码为JSON,但它支持相同的类型)
您无法使用插件。这意味着您需要通过传递数据(再次复制)或通过写入文件并将路径传回文件来将压缩数据移回UI线程,但在这种情况下,复制可能会更快,因为写入在一个线程中的文件,在另一个线程中读取它甚至更慢)。 然后,您可以在UI线程中调用图像上传到Firebase Cloud Storage,但由于这是一个插件,因此它将以本机代码运行,而不是在UI线程中运行。它只是需要传递图像的UI线程。