diff --git a/packages/cloud_firestore/android/build.gradle b/packages/cloud_firestore/android/build.gradle index 3d95ca18ea32..bca3d1fc65b7 100755 --- a/packages/cloud_firestore/android/build.gradle +++ b/packages/cloud_firestore/android/build.gradle @@ -13,7 +13,7 @@ buildscript { } } -allprojects { +rootProject.allprojects { repositories { google() jcenter() diff --git a/packages/image_picker/android/build.gradle b/packages/image_picker/android/build.gradle index b6ac95b63619..0039964e78f7 100755 --- a/packages/image_picker/android/build.gradle +++ b/packages/image_picker/android/build.gradle @@ -5,6 +5,7 @@ buildscript { repositories { google() jcenter() + mavenLocal() } dependencies { diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java index c4a7d7ecfa53..fe3979bf9c0c 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImagePickerDelegate.java @@ -450,8 +450,10 @@ private void handleImageResult(String path) { if (pendingResult != null) { Double maxWidth = methodCall.argument("maxWidth"); Double maxHeight = methodCall.argument("maxHeight"); + Double resizeQuality = methodCall.argument("resizeQuality"); - String finalImagePath = imageResizer.resizeImageIfNeeded(path, maxWidth, maxHeight); + String finalImagePath = + imageResizer.resizeImageIfNeeded(path, maxWidth, maxHeight, resizeQuality); finishWithSuccess(finalImagePath); } else { throw new IllegalStateException("Received image from picker that was not requested"); diff --git a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java index 25feba7611d1..1fed60f3160d 100644 --- a/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java +++ b/packages/image_picker/android/src/main/java/io/flutter/plugins/imagepicker/ImageResizer.java @@ -26,7 +26,8 @@ class ImageResizer { * *

If no resizing is needed, returns the path for the original image. */ - String resizeImageIfNeeded(String imagePath, Double maxWidth, Double maxHeight) { + String resizeImageIfNeeded( + String imagePath, Double maxWidth, Double maxHeight, Double resizeQuality) { boolean shouldScale = maxWidth != null || maxHeight != null; if (!shouldScale) { @@ -34,7 +35,7 @@ String resizeImageIfNeeded(String imagePath, Double maxWidth, Double maxHeight) } try { - File scaledImage = resizedImage(imagePath, maxWidth, maxHeight); + File scaledImage = resizedImage(imagePath, maxWidth, maxHeight, resizeQuality); exifDataCopier.copyExif(imagePath, scaledImage.getPath()); return scaledImage.getPath(); @@ -43,7 +44,8 @@ String resizeImageIfNeeded(String imagePath, Double maxWidth, Double maxHeight) } } - private File resizedImage(String path, Double maxWidth, Double maxHeight) throws IOException { + private File resizedImage(String path, Double maxWidth, Double maxHeight, Double resizeQuality) + throws IOException { Bitmap bmp = BitmapFactory.decodeFile(path); double originalWidth = bmp.getWidth() * 1.0; double originalHeight = bmp.getHeight() * 1.0; @@ -58,6 +60,8 @@ private File resizedImage(String path, Double maxWidth, Double maxHeight) throws boolean shouldDownscaleHeight = hasMaxHeight && maxHeight < originalHeight; boolean shouldDownscale = shouldDownscaleWidth || shouldDownscaleHeight; + resizeQuality = resizeQuality != null ? resizeQuality : new Double(1.0); + if (shouldDownscale) { double downscaledWidth = (height / originalHeight) * originalWidth; double downscaledHeight = (width / originalWidth) * originalHeight; @@ -85,7 +89,7 @@ private File resizedImage(String path, Double maxWidth, Double maxHeight) throws Bitmap scaledBmp = Bitmap.createScaledBitmap(bmp, width.intValue(), height.intValue(), false); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - scaledBmp.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); + scaledBmp.compress(Bitmap.CompressFormat.JPEG, (int) (resizeQuality * 100), outputStream); String[] pathParts = path.split("/"); String imageName = pathParts[pathParts.length - 1]; diff --git a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java index 5f560d480660..67a999a47684 100644 --- a/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java +++ b/packages/image_picker/example/android/app/src/test/java/io/flutter/plugins/imagepicker/ImagePickerDelegateTest.java @@ -26,6 +26,7 @@ public class ImagePickerDelegateTest { private static final double WIDTH = 10.0; private static final double HEIGHT = 10.0; + private static final double QUALITY = 0.5; @Mock Activity mockActivity; @Mock ImageResizer mockImageResizer; @@ -60,12 +61,21 @@ public void setUp() { when(mockFileUtils.getPathFromUri(any(Context.class), any(Uri.class))) .thenReturn("pathFromUri"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, null)) .thenReturn("originalPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT, null)) .thenReturn("scaledPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, null)).thenReturn("scaledPath"); - when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, HEIGHT)) + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, null, null)) + .thenReturn("scaledPath"); + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, HEIGHT, null)) + .thenReturn("scaledPath"); + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, null, QUALITY)) + .thenReturn("originalPath"); + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, null, QUALITY)) + .thenReturn("scaledPath"); + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", null, HEIGHT, QUALITY)) + .thenReturn("scaledPath"); + when(mockImageResizer.resizeImageIfNeeded("pathFromUri", WIDTH, HEIGHT, QUALITY)) .thenReturn("scaledPath"); mockFileUriResolver = new MockFileUriResolver(); diff --git a/packages/image_picker/example/android/build.gradle b/packages/image_picker/example/android/build.gradle index bb8a303898ca..e8d60daf6842 100755 --- a/packages/image_picker/example/android/build.gradle +++ b/packages/image_picker/example/android/build.gradle @@ -2,6 +2,7 @@ buildscript { repositories { google() jcenter() + mavenLocal() } dependencies { @@ -13,6 +14,7 @@ allprojects { repositories { google() jcenter() + mavenLocal() } } diff --git a/packages/image_picker/ios/Classes/ImagePickerPlugin.m b/packages/image_picker/ios/Classes/ImagePickerPlugin.m index 44e736948c66..8f75d2e8fab2 100644 --- a/packages/image_picker/ios/Classes/ImagePickerPlugin.m +++ b/packages/image_picker/ios/Classes/ImagePickerPlugin.m @@ -152,12 +152,16 @@ - (void)imagePickerController:(UIImagePickerController *)picker NSNumber *maxWidth = [_arguments objectForKey:@"maxWidth"]; NSNumber *maxHeight = [_arguments objectForKey:@"maxHeight"]; + NSNumber *resizeQuality = [_arguments objectForKey:@"resizeQuality"]; if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) { image = [self scaledImage:image maxWidth:maxWidth maxHeight:maxHeight]; } - NSData *data = UIImageJPEGRepresentation(image, 1.0); + if (resizeQuality == (id)[NSNull null]) { + resizeQuality = [NSNumber numberWithFloat:1.0f]; + } + NSData *data = UIImageJPEGRepresentation(image, [resizeQuality floatValue]); NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString]; NSString *tmpFile = [NSString stringWithFormat:@"image_picker_%@.jpg", guid]; NSString *tmpDirectory = NSTemporaryDirectory(); diff --git a/packages/image_picker/lib/image_picker.dart b/packages/image_picker/lib/image_picker.dart index da7847d3ecbf..a3c754360e26 100755 --- a/packages/image_picker/lib/image_picker.dart +++ b/packages/image_picker/lib/image_picker.dart @@ -33,6 +33,7 @@ class ImagePicker { @required ImageSource source, double maxWidth, double maxHeight, + double resizeQuality, }) async { assert(source != null); @@ -50,6 +51,7 @@ class ImagePicker { 'source': source.index, 'maxWidth': maxWidth, 'maxHeight': maxHeight, + 'resizeQuality': resizeQuality, }, ); diff --git a/packages/image_picker/test/image_picker_test.dart b/packages/image_picker/test/image_picker_test.dart index cb6be17dc055..8caba01923f8 100644 --- a/packages/image_picker/test/image_picker_test.dart +++ b/packages/image_picker/test/image_picker_test.dart @@ -34,11 +34,13 @@ void main() { 'source': 0, 'maxWidth': null, 'maxHeight': null, + 'resizeQuality': null, }), isMethodCall('pickImage', arguments: { 'source': 1, 'maxWidth': null, 'maxHeight': null, + 'resizeQuality': null, }), ], ); @@ -59,6 +61,26 @@ void main() { maxWidth: 10.0, maxHeight: 20.0, ); + await ImagePicker.pickImage( + source: ImageSource.camera, + resizeQuality: 0.5, + ); + await ImagePicker.pickImage( + source: ImageSource.camera, + maxWidth: 10.0, + resizeQuality: 0.5, + ); + await ImagePicker.pickImage( + source: ImageSource.camera, + maxHeight: 20.0, + resizeQuality: 0.5, + ); + await ImagePicker.pickImage( + source: ImageSource.camera, + maxWidth: 10.0, + maxHeight: 20.0, + resizeQuality: 0.5, + ); expect( log, @@ -67,21 +89,49 @@ void main() { 'source': 0, 'maxWidth': null, 'maxHeight': null, + 'resizeQuality': null, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': null, + 'resizeQuality': null, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': null, 'maxHeight': 10.0, + 'resizeQuality': null, + }), + isMethodCall('pickImage', arguments: { + 'source': 0, + 'maxWidth': 10.0, + 'maxHeight': 20.0, + 'resizeQuality': null, + }), + isMethodCall('pickImage', arguments: { + 'source': 0, + 'maxWidth': null, + 'maxHeight': null, + 'resizeQuality': 0.5, + }), + isMethodCall('pickImage', arguments: { + 'source': 0, + 'maxWidth': 10.0, + 'maxHeight': null, + 'resizeQuality': 0.5, + }), + isMethodCall('pickImage', arguments: { + 'source': 0, + 'maxWidth': null, + 'maxHeight': 20.0, + 'resizeQuality': 0.5, }), isMethodCall('pickImage', arguments: { 'source': 0, 'maxWidth': 10.0, 'maxHeight': 20.0, + 'resizeQuality': 0.5, }), ], );