Reduce the image size in flutter - flutter

I am trying to reduce the image selected from gallery size from MB to KB enter by the use. How can I do that?
I want a textbox in which the user can enter the value to reduce the size and after pressing a button
the images are resizer

You can try this package which provides various functions for image manipulation, resizing, cropping and much more.
Take a look at code usage examples at this page.
You should be able to resize image for given ressolution, with proper calculations you could be able to resize it into given size also.

flutter_image_compress Plugin provides the functionality to compress image size and weight
See Full Example on Github

If you are using Image Picker Library then you can directly use something like this. This is useful if you want to save it in Firebase or similar backend.
ImagePicker imagePicker = ImagePicker();
PickedFile compressedImage = await imagePicker.getImage(
source: ImageSource.camera,
imageQuality:70, // depending on compression ratio
);
Else if you want to use it only for compression then you can use Flutter Image Compression.
To convert png(Image File) to PDF, you can use this pdf.

There is a new package called to crop and resize ImageCropper and flutter image compress .
It allows you to crop and resize the image to any or specified aspect ratio you want and can even compress the image.
Here is the link,
1.Image cropper https://pub.dev/packages/image_cropper
2.flutter image compress https://pub.dev/packages/flutter_image_compress

Related

Is it possible to have Flutter image_picker return two of the same image but with different quality?

Flutter image_picker package allows one to select the quality of an image very easily and the re-sizing works really quickly:
XFile? pickedImage = await _picker.pickImage(
imageQuality: 80,
source: ImageSource.gallery);
I am looking for a best way to have the picked image be in a original size and smaller size for a thumbnail.
I have tried packages like image_compression_flutter but at least for web it seemed very slow, whereas as image_picker works very fast regardless of the quality setting (0-100).
Is there a good way to to use image_picker to do this?
The goal would be that the user picks one image but then there would be two files - pickedImage (imageQuality:80) and pickedImageThumb (imageQuality:10). Right now of course this code below does not work as it creates two instances of picking an image. Is there a way to do this without having the user pick the same image twice?
XFile? pickedImage = await _picker.pickImage(
imageQuality: 80,
source: ImageSource.gallery);
XFile? pickedImageThumb = await _picker.pickImage(
imageQuality: 10,
source: ImageSource.gallery);
If this does not work, is it possible to somehow use the same method image_picker uses in the background to do the compression as a stand alone function that would take pickedImage and resize it?
What is the main reason image_picker can do the compression so quickly compared to other packages and methods?
I think there is not a way to return same image with different qualities because of this i advice you that get picked image using image_picker and then resize the same image with different quality . You can use this library (flutter_native_image: ^0.0.6+1) to resize image
While I was trying to pick image from Flutter web I had some difficulties. Firstly,there was no XFile type, so picking from web required to use packages. However, those packages had were too slow at compressing images. I opened a new issue here, then I found workaround, which is commented there. I'm still waiting for the soulution of the issue to be able to compress web image.
If you want to resize an image you should sacrifice web support. But if you want web support you should resize the image on your server.

is there a way to upload two different versions of the same image picked from gallery using Image Picker in flutter?

I have issues with image sizes on my flutter e-commerce app I am building. I have tried reducing the image sizes using the max height, max width and image quality parameters, but loading times are still slow as the image sizes are still around 150kb on average because i was still trying to preserve image quality. I figured a way out of this will be to upload two versions of the same image when the user is uploading. First image will be compressed to have a size of 30kb and this will be the image to be displayed on the main pages of the app where other products are, however when a user clicks to view the product i will render the other image which has slightly better quality. The issue i am having is, when i pick an image with Image Picker, i can only set the image quality parameters once. Any way around this will be appreciated. Below is the code for how i pick the images.
chooseImage() async {
final pickedFile = await picker.getImage(source: ImageSource.gallery,
maxHeight: 500,
maxWidth: 500,
imageQuality: 50
);
setState(() {
_image.add(File(pickedFile?.path));
});
if (pickedFile.path == null) retrieveLostData();
}
I had run into the same problem that you are facing a few months back. There is an extension on firebase called resize image. You can use this to resize the image once it's in the DB without doing it manually and complicating your app.
https://firebase.google.com/products/extensions/firebase-storage-resize-images
You can then save the image link in your document.

How to load all gallary images quickly in flutter

I want to make a custom image picker in a custom bottom sheet. I did it using photo_manager package and it works, but it loads images with full resolution, so it is so slow and it gets slower as I scroll down to see more images.
how can I load gallary images into a bottom sheet so fast? (as fast as telegram chat image picker!)
There is a option for thumbnail:
Uint8List thumbDataWithSize = await entity.thumbDataWithSize(width,height); //Just like thumbnails, you can specify your own size. unit is px; format is optional support jpg and png.
I've used it with 400*400, and it's quite ok

Want to resize a image with better resolution in swift

I have a image which is uploaded in the image cloud-cloudinary using the API.The response of the upload gives me the cloudinary uploaded url.
Example of one image is as given:
This image is of 120*67 which is uploaded.Now in my app,it looks like this.
The width of my image is as per the phone screen width and the height is fixed to 324.Now i want to resize this 120*67 image to the width and height of my image in the app without losing its clarity.I have made the content mode as scale to fill for the imageview.
Generally, scaling up (non vectorized) images without compromising their quality is not possible (without machine learning). Some software programs have complex algorithms to help with upscaling, but that's also to a limited extent.
You should upload a larger version of your image to Cloudinary, and request it downscaled to the desired resolution.
You should also check out responsive layout design.
If the image is vectorized (e.g - SVG), you need to make sure you're not requesting a rasterized version of it. I.E -
https://res.cloudinary.com/<cloud name>/image/upload/fl_sanitize/<image name>.svg
will keep the image vectorized.

Filestack - I want to convert an image to a specific pixel size before uploading it to Filestack. How can I do that?

I am working on an application for watermarking a photo. The application has three main steps: 1) upload the main image file, 2) upload the watermark image file, and 3) apply the watermark to the main photo.
I want to convert the watermark to a specific pixel size, before I upload it to Filestack to perform the watermark transformation. How can I change an image file size to specific pixel dimensions before performing the upload with Filestack?
There are a couple ways to approach this issue.
The first on would be to use the 'imageDim' function within the Filestack Filepicker.
It would look like this:
client.pick({
imageDim: [400, 400]
})
After the upload is complete you can place your watermark over the image.
If you already have the image uploaded and you want to use the existing file handle, you would do it like this:
client.storeURL('https://process.filestackapi.com/resize=height:400,width:400/'+ file.handle)
You can also add the watermark call in the storeURL function.