E/flutter (21267): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Instance of 'CompressError'

546 views Asked by At

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)
1

There are 1 answers

0
Cynthia Konar On

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.