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: