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 线程需要传递图像。
我正在尝试压缩来自相机或画廊的图像,但我尝试回答这个问题
但是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 线程需要传递图像。