From 006c665125b78dacc0391fb201635a7dc3d1e623 Mon Sep 17 00:00:00 2001 From: yusufdag Date: Fri, 7 May 2021 17:05:59 +0200 Subject: [PATCH 1/8] Refactor scaleImage method to handle nil metadata --- .../ios/Classes/FLTImagePickerImageUtil.h | 3 ++- .../ios/Classes/FLTImagePickerImageUtil.m | 18 +++++++++++++-- .../ios/Classes/FLTImagePickerPlugin.m | 22 ++++++++++++------- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h index 02b58d38a12e..79667894c8e4 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 @@ NS_ASSUME_NONNULL_BEGIN + (UIImage *)scaledImage:(UIImage *)image maxWidth:(NSNumber *)maxWidth - maxHeight:(NSNumber *)maxHeight; + maxHeight:(NSNumber *)maxHeight + metadataAvailability:(BOOL)metadataAvailability; // 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 2f6ead7317b9..f6c37db45451 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 @@ @implementation FLTImagePickerImageUtil : NSObject + (UIImage *)scaledImage:(UIImage *)image maxWidth:(NSNumber *)maxWidth - maxHeight:(NSNumber *)maxHeight { + maxHeight:(NSNumber *)maxHeight + metadataAvailability:(BOOL)metadataAvailability { double originalWidth = image.size.width; double originalHeight = image.size.height; @@ -69,6 +70,19 @@ + (UIImage *)scaledImage:(UIImage *)image } } + if (!metadataAvailability) { + 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 @@ + (GIFInfo *)scaledGIFImage:(NSData *)data } 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 metadataAvailability: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 c368c424f2c4..1e1bbf8620cf 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m @@ -367,15 +367,17 @@ - (void)picker:(PHPickerViewController *)picker if (image != nil) { __block UIImage *localImage = image; dispatch_async(dispatch_get_main_queue(), ^{ - if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) { - localImage = [FLTImagePickerImageUtil scaledImage:localImage - maxWidth:maxWidth - maxHeight:maxHeight]; - } - PHAsset *originalAsset = [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:result]; + if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) { + localImage = + [FLTImagePickerImageUtil scaledImage:localImage + maxWidth:maxWidth + maxHeight:maxHeight + metadataAvailability:originalAsset == nil ? NO : YES]; + } + if (!originalAsset) { // Image picked without an original asset (e.g. User took a photo directly) [self saveImageWithPickerInfo:nil @@ -449,11 +451,15 @@ - (void)imagePickerController:(UIImagePickerController *)picker 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 + metadataAvailability:originalAsset == nil ? NO : YES]; } - 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]; From 936ff6bb093b411f31c6e97e37ed223cf156a0ec Mon Sep 17 00:00:00 2001 From: yusufdag Date: Fri, 7 May 2021 17:06:28 +0200 Subject: [PATCH 2/8] Refactor the unit test to add extra parameter --- .../image_picker/image_picker/ios/Tests/ImageUtilTests.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m index 958c99f9c651..e7f141e89ed1 100644 --- a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m +++ b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m @@ -14,7 +14,10 @@ @implementation ImageUtilTests - (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 + metadataAvailability:YES]; XCTAssertEqual(newImage.size.width, 3); XCTAssertEqual(newImage.size.height, 2); From d02c78a4ee09b2ec58baa6eecd0811ef081c837f Mon Sep 17 00:00:00 2001 From: yusufdag Date: Mon, 10 May 2021 15:09:29 +0200 Subject: [PATCH 3/8] Update the version number --- packages/image_picker/image_picker/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 4bc7cbe1f4f0..466615d940d4 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker 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.6 flutter: plugin: From cbcc751be59b655ca8c9357d0e8124806158bcce Mon Sep 17 00:00:00 2001 From: yusufdag Date: Mon, 10 May 2021 15:09:44 +0200 Subject: [PATCH 4/8] Add the description into CHANGELOG file --- packages/image_picker/image_picker/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 9c2bcc72b7e3..14b22a4b5b55 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.7.6 + +* 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. From 74c64ae0c7fd59201079f23c1f02e69171988cde Mon Sep 17 00:00:00 2001 From: yusufdag Date: Tue, 11 May 2021 21:18:27 +0200 Subject: [PATCH 5/8] Fix the version number --- packages/image_picker/image_picker/CHANGELOG.md | 2 +- packages/image_picker/image_picker/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 14b22a4b5b55..380fcf4cbfb3 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.7.6 +## 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. diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 466615d940d4..fa6f653fa003 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker 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.6 +version: 0.7.5+1 flutter: plugin: From eb07255cc25806f84bc59bfffec849458c663550 Mon Sep 17 00:00:00 2001 From: yusufdag Date: Tue, 11 May 2021 21:30:36 +0200 Subject: [PATCH 6/8] Fix name convention --- .../image_picker/ios/Classes/FLTImagePickerImageUtil.h | 2 +- .../image_picker/ios/Classes/FLTImagePickerImageUtil.m | 6 +++--- .../image_picker/ios/Classes/FLTImagePickerPlugin.m | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h index 79667894c8e4..b0edd03e5076 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN + (UIImage *)scaledImage:(UIImage *)image maxWidth:(NSNumber *)maxWidth maxHeight:(NSNumber *)maxHeight - metadataAvailability:(BOOL)metadataAvailability; + 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 f6c37db45451..7b454072ecff 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerImageUtil.m @@ -31,7 +31,7 @@ @implementation FLTImagePickerImageUtil : NSObject + (UIImage *)scaledImage:(UIImage *)image maxWidth:(NSNumber *)maxWidth maxHeight:(NSNumber *)maxHeight - metadataAvailability:(BOOL)metadataAvailability { + isMetadataAvailable:(BOOL)isMetadataAvailable { double originalWidth = image.size.width; double originalHeight = image.size.height; @@ -70,7 +70,7 @@ + (UIImage *)scaledImage:(UIImage *)image } } - if (!metadataAvailability) { + if (!isMetadataAvailable) { UIImage *imageToScale = [UIImage imageWithCGImage:image.CGImage scale:1 orientation:image.imageOrientation]; @@ -144,7 +144,7 @@ + (GIFInfo *)scaledGIFImage:(NSData *)data } UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp]; - image = [self scaledImage:image maxWidth:maxWidth maxHeight:maxHeight metadataAvailability:YES]; + 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 1e1bbf8620cf..2b1be4c2a130 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m @@ -375,7 +375,7 @@ - (void)picker:(PHPickerViewController *)picker [FLTImagePickerImageUtil scaledImage:localImage maxWidth:maxWidth maxHeight:maxHeight - metadataAvailability:originalAsset == nil ? NO : YES]; + isMetadataAvailable:originalAsset == nil ? NO : YES]; } if (!originalAsset) { @@ -457,7 +457,7 @@ - (void)imagePickerController:(UIImagePickerController *)picker image = [FLTImagePickerImageUtil scaledImage:image maxWidth:maxWidth maxHeight:maxHeight - metadataAvailability:originalAsset == nil ? NO : YES]; + isMetadataAvailable:originalAsset == nil ? NO : YES]; } if (!originalAsset) { From d28036b5c19bf88348b60571f927b01f97681c9f Mon Sep 17 00:00:00 2001 From: yusufdag Date: Wed, 12 May 2021 09:43:04 +0200 Subject: [PATCH 7/8] Refactor the statement --- .../image_picker/ios/Classes/FLTImagePickerPlugin.m | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m index 2b1be4c2a130..2a9e70cd0081 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTImagePickerPlugin.m @@ -371,11 +371,10 @@ - (void)picker:(PHPickerViewController *)picker [FLTImagePickerPhotoAssetUtil getAssetFromPHPickerResult:result]; if (maxWidth != (id)[NSNull null] || maxHeight != (id)[NSNull null]) { - localImage = - [FLTImagePickerImageUtil scaledImage:localImage - maxWidth:maxWidth - maxHeight:maxHeight - isMetadataAvailable:originalAsset == nil ? NO : YES]; + localImage = [FLTImagePickerImageUtil scaledImage:localImage + maxWidth:maxWidth + maxHeight:maxHeight + isMetadataAvailable:originalAsset != nil]; } if (!originalAsset) { @@ -457,7 +456,7 @@ - (void)imagePickerController:(UIImagePickerController *)picker image = [FLTImagePickerImageUtil scaledImage:image maxWidth:maxWidth maxHeight:maxHeight - isMetadataAvailable:originalAsset == nil ? NO : YES]; + isMetadataAvailable:originalAsset != nil]; } if (!originalAsset) { From 570603aeee711f71615c61588697ed9ec6a84b39 Mon Sep 17 00:00:00 2001 From: yusufdag Date: Wed, 12 May 2021 09:46:46 +0200 Subject: [PATCH 8/8] Add unit test for no metadata --- .../image_picker/ios/Tests/ImageUtilTests.m | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m index e7f141e89ed1..54a691d70963 100644 --- a/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m +++ b/packages/image_picker/image_picker/ios/Tests/ImageUtilTests.m @@ -17,7 +17,18 @@ - (void)testScaledImage_ShouldBeScaled { UIImage *newImage = [FLTImagePickerImageUtil scaledImage:image maxWidth:@3 maxHeight:@2 - metadataAvailability:YES]; + 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);