compressImageToJpg function

Future<File?> compressImageToJpg({
  1. required File inputFile,
  2. int? width,
  3. int? height,
  4. File? outputFile,
  5. int quality = 100,
})

Implementation

Future<File?> compressImageToJpg({
  required File inputFile,
  int? width,
  int? height,
  File? outputFile,
  int quality = 100,
}) async {
  // 异步读取文件字节
  final imageBytes = await inputFile.readAsBytes();

  // 在isolate中执行图像解码和调整大小
  final resized = await compute(
      _decodeAndResize,
      _ResizeParams(
        imageBytes: imageBytes,
        width: width,
        height: height,
      ));

  if (resized == null) return null;

  // 在isolate中执行JPEG编码
  final jpegData = await compute(
      _encodeJpeg,
      _EncodeParams(
        image: resized,
        quality: quality,
      ));

  outputFile ??= File(
      "${getDirname(inputFile.path)}/${getBasenameWithoutExtension(inputFile.path)}_compressed.jpg");

  // 异步写入文件
  final compressedFile = await outputFile.writeAsBytes(jpegData);

  logDebug('compressed: ${compressedFile.path} '
      'width: ${resized.width} height: ${resized.height} '
      'before: ${inputFile.lengthSync()} '
      'after: ${compressedFile.lengthSync()}');

  return compressedFile;
}