0

I'm trying to compress a picture with Flutter and know the original and compressed sizes. But I am getting an error. Kindly look at the compressImage() function:

  Future<void> _compressImage() async {
    if (_image == null) {
      return;
    }

    final originalSize = _originalSize ?? await _image!.length();

    final compressedImage = await FlutterImageCompress.compressAndGetFile(
      _image!.path,
      _image!.path,
      quality: 60,
    );

    final compressedSize = await compressedImage!.length();

    setState(() {
      _image = compressedImage;
      _compressedSize = compressedSize;
    });
    print('Original Size =====> $originalSize');
    print('Compressed Size =====> $compressedSize');

  }

These are the variables and pickImageFromCamera() Function:

  XFile? _image;
  int? _originalSize;
  int? _compressedSize;
  late XFile pickedImage;

  Future<void> _pickImageCamera() async {
    final picker = ImagePicker();
    final pickedImage = await picker.pickImage(source: ImageSource.camera);
    if (pickedImage != null) {
      final XFile image = XFile(pickedImage.path);
      final originalSize = await image.length();
      setState(() {
        _image = image;
        _originalSize = originalSize;
        _compressedSize = null;
      });
    }
  }

When I execute compressImage() function; I am getting this error:

E/flutter (21267): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Instance of 'CompressError'
E/flutter (21267): #0      FlutterImageCompressCommon.compressAndGetFile (package:flutter_image_compress_common/flutter_image_compress_common.dart:173:7)
E/flutter (21267): #1      FlutterImageCompress.compressAndGetFile (package:flutter_image_compress/flutter_image_compress.dart:105:22)
E/flutter (21267): #2      _ImageCompressorState._compressImage (package:ezy_img_compressor/image_compressor.dart:52:56)
E/flutter (21267): #3      _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1154:21)
E/flutter (21267): #4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:275:24)
E/flutter (21267): #5      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:654:11)
E/flutter (21267): #6      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:311:5)
E/flutter (21267): #7      BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:281:7)
E/flutter (21267): #8      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:167:27)
E/flutter (21267): #9      GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:469:20)
E/flutter (21267): #10     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:445:22)
E/flutter (21267): #11     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:331:11)
E/flutter (21267): #12     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:400:7)
E/flutter (21267): #13     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:363:5)
E/flutter (21267): #14     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:320:7)
E/flutter (21267): #15     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:293:9)
E/flutter (21267): #16     _invoke1 (dart:ui/hooks.dart:158:13)
E/flutter (21267): #17     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:382:7)
E/flutter (21267): #18     _dispatchPointerDataPacket (dart:ui/hooks.dart:91:31)
HighTower
  • 1
  • 2

1 Answers1

0

The issue is with the image path destination you are using for storing the compressed image, it should be different.

This worked for me(for jpg, jpeg, and png):

    final lastIndex =  _image.path.lastIndexOf(RegExp(r'.jp'));
    final splitted =  _image.path.substring(0, (lastIndex));
    final outPath = "${splitted}_out${croppedFile.path.substring(lastIndex)}";

    XFile? compressedFile = await FlutterImageCompress.compressAndGetFile(
       _image.absolute.path,
       outPath, // destination
       quality: 88);

If format is png, the quality param will be ignored in iOS.