Flutter 压缩图像的最佳方式

use*_*004 16 dart flutter

我尝试在使用 flutter image_picker 包上传到存储之前压缩图像。我找到了三种方法来做到这一点,但我不确定哪种方法是最好的。

  1. 使用 image_picker 包的 imageQuality 参数

图像选择器

  1. 使用 flutter_image_compress 包

flutter_image_compress

  1. 使用 flutter_native_image 包

flutter_native_image

这些选项之间有什么区别吗?

感谢任何帮助和解释。

Joe*_*ler 36

以下是潜在解决方案的细分。TLDR 是 flutter_image_compress 包比 ImagePicker 类本身更能压缩文件。

图像选择器

正如其他人所建议的,您可以使用 ImagePicker 的内置 imaqeQuality 属性来压缩图像。此属性采用 0 到 100 之间的值,表示原始图像质量的百分比。这种方法的好处是它内置在 image_picker 包中,因此非常容易使用。

  File _image;

  Future getImage() async {
    var image = await ImagePicker.pickImage(
        source: ImageSource.gallery,  
                imageQuality: 25,
    );

    setState(() {
      _image = image;
    });
  }
Run Code Online (Sandbox Code Playgroud)

我做了一个小测试,看看各种值对图像大小的影响有多大:

100% 图像质量 - 4.58MB 在此处输入图片说明

50% 图像质量 - 3.58MB 在此处输入图片说明

25% 图像质量 - 2.61MB 在此处输入图片说明

1% 图像质量 - 2.12MB 在此处输入图片说明

0% 图像质量 - 3.9MB 在此处输入图片说明

总之,您可以将图像的文件大小减少一半以上,而不会产生太大的明显差异。试图将图像质量强制为 0% 实际上并不会缩小文件大小。

flutter_image_compress
flutter_image_compress包是使用相当简单,它似乎要好得多,在实际上减少了文件大小。

Future<File> compressFile(File file) async {
  final filePath = file.absolute.path;

  // Create output file path
  // eg:- "Volume/VM/abcd_out.jpeg"
  final lastIndex = filePath.lastIndexOf(new RegExp(r'.jp'));
  final splitted = filePath.substring(0, (lastIndex));
  final outPath = "${splitted}_out${filePath.substring(lastIndex)}";
  var result = await FlutterImageCompress.compressAndGetFile(
    file.absolute.path, outPath,
    quality: 5,
  );

  print(file.lengthSync());
  print(result.lengthSync());

  return result;
 }
Run Code Online (Sandbox Code Playgroud)

我将省略这里的图像,因为它们看起来都一样:
50% 图像质量 - 590KB
25% 图像质量 - 276KB
5% 图像质量 - 211KB

flutter_native_image就文件大小而言flutter_native_image包与flutter_image_compress包相当。

Future<File> compressFile(File file) async{
    File compressedFile = await FlutterNativeImage.compressImage(file.path,
        quality: 5,);
    return compressedFile;
  }
Run Code Online (Sandbox Code Playgroud)

50% 图像质量 - 1.02MB
25% 图像质量 - 309KB
5% 图像质量 - 204KB

我想这种方法的好处之一是您不需要为其提供压缩文件的输出路径。


Ουι*_*ευα 13

我构建了一个应用程序,它使用三个包来压缩图像文件:flutter_image_compressflutter_native_imageflutter_luban。在比较了这些包之后,我可以说flutter_image_compress是迄今为止最好的图像压缩工具。

我的应用程序受到@Joe_Muller 的回复的启发,源代码在这里

预览


G g*_*ffo 7

图像选择器

使用图像选择器,您可以轻松高效地设置图像质量,如下所示

File _image;

  Future getImage() async {
    var image = await ImagePicker.pickImage(
        source: ImageSource.camera, imageQuality: 50);

    setState(() {
      _image = image;
    });
  }
Run Code Online (Sandbox Code Playgroud)

图像质量百分比 100 是最高的