compressImage method

  1. @override
Future<XFile> compressImage(
  1. XFile pickedFile, {
  2. int quality = 35,
})
override

Implementation

@override
Future<XFile> compressImage(XFile pickedFile, {int quality = 35}) async {
  try {
    if (kIsWeb) {
      // Web fallback: compress with `image` package
      final bytes = await pickedFile.readAsBytes();
      final decoded = img.decodeImage(bytes);
      if (decoded == null) return pickedFile;

      final compressedBytes = img.encodeJpg(decoded, quality: quality);

      final compressedXFile = XFile.fromData(
        compressedBytes,
        name: pickedFile.name,
      );

      debugPrint(
        'Compress (web): original=${bytes.length} compressed=${compressedBytes.length}',
      );

      return compressedXFile;
    } else {
      // Mobile / Desktop (using flutter_image_compress)
      final String tempDir = (await getTemporaryDirectory()).path;
      final String targetPath = p.join(
        tempDir,
        '${DateTime.now().millisecondsSinceEpoch}${p.extension(pickedFile.path)}',
      );

      final XFile? compressed = await FlutterImageCompress.compressAndGetFile(
        pickedFile.path,
        targetPath,
        quality: quality,
      );

      debugPrint(
        'Compress: original=${await pickedFile.length()} compressed=${await compressed?.length()}',
      );

      return compressed ?? pickedFile;
    }
  } catch (e) {
    debugPrint('AppImageCompressorService | error: $e');
    return pickedFile;
  }
}