天天看點

Flutter 壓縮圖像的最佳方式

Flutter 壓縮圖像的最佳方式

引言

作為開發者的我們,經常會做一些上傳圖檔和和儲存圖檔啦的功能,但是由于一些圖檔非常大,我們在上傳或者儲存的時候會占用大量的網絡資源和本地資源,那麼我們需要做的就是對圖檔進行壓縮。

昨天在寫如何接入微信分享的時候用到一個知識點,就是圖檔壓縮

當時我用了flutter_image_compress

可能大家都知道Dart 已經有圖檔壓縮庫了。為什麼要使用原生?

還不是因為他的效率問題,

是以今天就和大家來說一說它的具體用法吧。

1.flutter_image_compress

安裝

dependencies:
  flutter_image_compress: ^1.0.0-nullsafety      

使用的地方導入

import 'package:flutter_image_compress/flutter_image_compress.dart';      
/// 圖檔壓縮 File -> Uint8List
  Future<Uint8List> testCompressFile(File file) async {
    var result = await FlutterImageCompress.compressWithFile(
      file.absolute.path,
      minWidth: 2300,
      minHeight: 1500,
      quality: 94,
      rotate: 90,
    );
    print(file.lengthSync());
    print(result.length);
    return result;
  }

  /// 圖檔壓縮 File -> File
  Future<File> testCompressAndGetFile(File file, String targetPath) async {
    var result = await FlutterImageCompress.compressAndGetFile(
        file.absolute.path, targetPath,
        quality: 88,
        rotate: 180,
      );

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

    return result;
  }

  /// 圖檔壓縮 Asset -> Uint8List
  Future<Uint8List> testCompressAsset(String assetName) async {
    var list = await FlutterImageCompress.compressAssetImage(
      assetName,
      minHeight: 1920,
      minWidth: 1080,
      quality: 96,
      rotate: 180,
    );

    return list;
  }


  /// 圖檔壓縮 Uint8List -> Uint8List
  Future<Uint8List> testComporessList(Uint8List list) async {
    var result = await FlutterImageCompress.compressWithList(
      list,
      minHeight: 1920,
      minWidth: 1080,
      quality: 96,
      rotate: 135,
    );
    print(list.length);
    print(result.length);
    return result;
  }      

還有另外兩種方式

2.使用 image_picker 包的 imageQuality 參數

圖像選擇器

3.使用 flutter_native_image 包

​​​​

安裝

flutter_native_image: ^0.0.6      

文檔位址

pub.flutter-io.cn/packages/fl…

用法

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

關于如何計算所選檔案的圖像大小的嗎?

您可以以位元組為機關擷取檔案長度,并以千位元組或兆位元組等計算。

像這樣:file.readAsBytesSync().lengthInBytes -> 檔案大小以位元組為機關的檔案大小

(file.readAsBytesSync().lengthInBytes) / 1024 -> 檔案大小以千位元組為機關的檔案大小

(file.readAsBytesSync().lengthInBytes) / 1024 / 1024 -> 檔案大小以兆位元組為機關

總結