[image_picker] Image picker fix metadata (#3873)
This PR fixes a rotation problem where "Select Photos" limited access is chosen but the image that is picked is not included in selected photos and the image is scaled.
diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md
index 9c2bcc7..380fcf4 100644
--- a/packages/image_picker/image_picker/CHANGELOG.md
+++ b/packages/image_picker/image_picker/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 0.7.5+1
+
+* Fixes a rotation problem where Select Photos limited access is chosen but the image that is picked
+is not included selected photos and image is scaled.
+
## 0.7.5
* Fixes an issue where image rotation is wrong when Select Photos chose and image is scaled.
diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h
index 02b58d3..b0edd03 100644
--- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h
+++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h
@@ -20,7 +20,8 @@
+ (UIImage *)scaledImage:(UIImage *)image
maxWidth:(NSNumber *)maxWidth
- maxHeight:(NSNumber *)maxHeight;
+ maxHeight:(NSNumber *)maxHeight
+ isMetadataAvailable:(BOOL)isMetadataAvailable;
// Resize all gif animation frames.
+ (GIFInfo *)scaledGIFImage:(NSData *)data
diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m
index 2f6ead7..7b45407 100644
--- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m
+++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m
@@ -30,7 +30,8 @@
+ (UIImage *)scaledImage:(UIImage *)image
maxWidth:(NSNumber *)maxWidth
- maxHeight:(NSNumber *)maxHeight {
+ maxHeight:(NSNumber *)maxHeight
+ isMetadataAvailable:(BOOL)isMetadataAvailable {
double originalWidth = image.size.width;
double originalHeight = image.size.height;
@@ -69,6 +70,19 @@
}
}
+ if (!isMetadataAvailable) {
+ UIImage *imageToScale = [UIImage imageWithCGImage:image.CGImage
+ scale:1
+ orientation:image.imageOrientation];
+
+ UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 1.0);
+ [imageToScale drawInRect:CGRectMake(0, 0, width, height)];
+
+ UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
+ UIGraphicsEndImageContext();
+ return scaledImage;
+ }
+
// Scaling the image always rotate itself based on the current imageOrientation of the original
// Image. Set to orientationUp for the orignal image before scaling, so the scaled image doesn't
// mess up with the pixels.
@@ -130,7 +144,7 @@
}
UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];
- image = [self scaledImage:image maxWidth:maxWidth maxHeight:maxHeight];
+ image = [self scaledImage:image maxWidth:maxWidth maxHeight:maxHeight isMetadataAvailable:YES];
[images addObject:image];
diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
index c368c42..2a9e70c 100644
--- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
+++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m
@@ -367,15 +367,16 @@
if (image != nil) {
__block UIImage *localImage = image;
dispatch_async(dispatch_get_main_queue(), ^{
+ PHAsset *originalAsset =
+ [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:result];
+
if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) {
localImage = [FLTImagePickerImageUtil scaledImage:localImage
maxWidth:maxWidth
- maxHeight:maxHeight];
+ maxHeight:maxHeight
+ isMetadataAvailable:originalAsset != nil];
}
- PHAsset *originalAsset =
- [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:result];
-
if (!originalAsset) {
// Image picked without an original asset (e.g. User took a photo directly)
[self saveImageWithPickerInfo:nil
@@ -449,11 +450,15 @@
NSNumber *imageQuality = [_arguments objectForKey:@"imageQuality"];
NSNumber *desiredImageQuality = [self getDesiredImageQuality:imageQuality];
+ PHAsset *originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromImagePickerInfo:info];
+
if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) {
- image = [FLTImagePickerImageUtil scaledImage:image maxWidth:maxWidth maxHeight:maxHeight];
+ image = [FLTImagePickerImageUtil scaledImage:image
+ maxWidth:maxWidth
+ maxHeight:maxHeight
+ isMetadataAvailable:originalAsset != nil];
}
- PHAsset *originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromImagePickerInfo:info];
if (!originalAsset) {
// Image picked without an original asset (e.g. User took a photo directly)
[self saveImageWithPickerInfo:info image:image imageQuality:desiredImageQuality];
diff --git a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m
index 958c99f..54a691d 100644
--- a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m
+++ b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m
@@ -14,7 +14,21 @@
- (void)testScaledImage_ShouldBeScaled {
UIImage *image = [UIImage imageWithData:ImagePickerTestImages.JPGTestData];
- UIImage *newImage = [FLTImagePickerImageUtil scaledImage:image maxWidth:@3 maxHeight:@2];
+ UIImage *newImage = [FLTImagePickerImageUtil scaledImage:image
+ maxWidth:@3
+ maxHeight:@2
+ isMetadataAvailable:YES];
+
+ XCTAssertEqual(newImage.size.width, 3);
+ XCTAssertEqual(newImage.size.height, 2);
+}
+
+- (void)testScaledImage_ShouldBeScaledWithNoMetadata {
+ UIImage *image = [UIImage imageWithData:ImagePickerTestImages.JPGTestData];
+ UIImage *newImage = [FLTImagePickerImageUtil scaledImage:image
+ maxWidth:@3
+ maxHeight:@2
+ isMetadataAvailable:NO];
XCTAssertEqual(newImage.size.width, 3);
XCTAssertEqual(newImage.size.height, 2);
diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml
index 4bc7cbe..fa6f653 100755
--- a/packages/image_picker/image_picker/pubspec.yaml
+++ b/packages/image_picker/image_picker/pubspec.yaml
@@ -2,7 +2,7 @@
description: Flutter plugin for selecting images from the Android and iOS image
library, and taking new pictures with the camera.
homepage: https://github.com/flutter/plugins/tree/master/packages/image_picker/image_picker
-version: 0.7.5
+version: 0.7.5+1
flutter:
plugin: