import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_image_compress/flutter_image_compress.dart'; import 'package:image_cropper/image_cropper.dart'; import 'package:image_picker/image_picker.dart'; import 'app_style.dart'; class ImagePickerHelper { static Future<void> pickImage({ required Function(File? file) onDone, }) async { final pickedImage = await ImagePicker.platform.pickImage(source: ImageSource.gallery); if (pickedImage == null) { onDone.call(null); return; } final pickedFile = File(pickedImage.path); final croppedImage = await _cropImage(pickedFile); final compressedImage = await _compressFile(croppedImage); if (compressedImage == null) { onDone.call(null); return; } onDone.call(compressedImage); } static String getFileSize(File file) { final fileSizeInMB = (file.lengthSync() / (1024 * 1024)).toStringAsFixed(2); return fileSizeInMB; } static Future<File?>? _cropImage(File file) async { final croppedFile = await ImageCropper.platform.cropImage( sourcePath: file.path, aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1), compressQuality: 60, uiSettings: [ AndroidUiSettings( toolbarTitle: 'Crop Image', toolbarColor: AppStyle.lightPurple, toolbarWidgetColor: Colors.white, initAspectRatio: CropAspectRatioPreset.square, lockAspectRatio: true, ), IOSUiSettings( minimumAspectRatio: 1.0, aspectRatioLockEnabled: true, resetAspectRatioEnabled: true, ), ], ); if (croppedFile == null) return null; return File(croppedFile.path); } static Future<File?> _compressFile(File? file) async { if (file == null) return null; final targetPath = '${file.parent.path}/compressed_${file.path.split('/').last}'; final XFile? result = await FlutterImageCompress.compressAndGetFile( file.absolute.path, targetPath, quality: 60, keepExif: false, ); if (result == null) return null; return File(result.path); } }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter