ramya
ramya

Reputation: 141

What is the right way of reducing image size captured from flutter camera plugin

I am using the example code from Flutter Camera Plugin. I want to reduce Image size once I capture the image and store it in imageFile variable.

I am not sure is there a built in feature available. didn't find any information in their documentation.

I tried to use Image Plugin to achieve it like below. but it is not working. the entire application stops it function when you use it.

 void onTakePictureButtonPressed() {
    takePicture().then((XFile? file) {
      if (mounted) {
        setState(() {
          resizeImage(file)  // this is what I tried to add to achieve it...
          imageFile = file;
          videoController?.dispose();
          videoController = null;
        });
        if (file != null) showInSnackBar('Picture saved to ${file.path}');
      }
    });
  }



XFile resizeImage(img) {
    var image = imageP.decodeJpg(File(img.path).readAsBytesSync());
    var thumbnail = imageP.copyResize(image, width: 400);
    File(img.path).writeAsBytesSync(imageP.encodeJpg(thumbnail));
    return XFile(img.path);
  }

Upvotes: 5

Views: 2172

Answers (1)

ramya
ramya

Reputation: 141

There is a bug in Image Package.... I used flutter_native_image Package and it worked....

  void onTakePictureButtonPressed() {
        takePicture().then((XFile? file) {
          if (mounted) {
            setState(() {
              resizeImage(file)  // this is what I tried to add to achieve it...
              imageFile = file;
              videoController?.dispose();
              videoController = null;
            });
            if (file != null) showInSnackBar('Picture saved to ${file.path}');
          }
        });
      }

here is the image compression function code.

Future<XFile> resizeImage(img) async {
    ImageProperties properties =
        await FlutterNativeImage.getImageProperties(img.path);

    File compressedFile = await FlutterNativeImage.compressImage(img.path,
        quality: 90,
        targetWidth: 500,
        targetHeight: (properties.height! * 500 / properties.width!).round());
    
        // delete original file
        try {
          if (await img.exists()) {
            await img.delete();
          }
        } catch (e) {
          // Error in getting access to the file.
        }

    return XFile(compressedFile.path);
  }

Upvotes: 2

Related Questions