diff --git a/packages/image_picker/image_picker/CHANGELOG.md b/packages/image_picker/image_picker/CHANGELOG.md index 2ba5a2ce4ce7..b37a26612fd1 100644 --- a/packages/image_picker/image_picker/CHANGELOG.md +++ b/packages/image_picker/image_picker/CHANGELOG.md @@ -1,3 +1,8 @@ + +## 0.8.4+12 + +* iOS:support images with heic,heif,raw,tiff formats. + ## 0.8.4+11 * Fixes Activity leak. diff --git a/packages/image_picker/image_picker/example/ios/Runner.xcodeproj/project.pbxproj b/packages/image_picker/image_picker/example/ios/Runner.xcodeproj/project.pbxproj index 2847bfd85046..fedfc355a78a 100644 --- a/packages/image_picker/image_picker/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/image_picker/image_picker/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,10 +3,18 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ + 1E9937F227DE2EB50047F36B /* tiffImage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937EE27DE2EB50047F36B /* tiffImage.tiff */; }; + 1E9937F327DE2EB50047F36B /* tiffImage.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937EE27DE2EB50047F36B /* tiffImage.tiff */; }; + 1E9937F427DE2EB50047F36B /* heicImage.heic in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937EF27DE2EB50047F36B /* heicImage.heic */; }; + 1E9937F527DE2EB50047F36B /* heicImage.heic in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937EF27DE2EB50047F36B /* heicImage.heic */; }; + 1E9937F627DE2EB50047F36B /* heifImage.heif in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937F027DE2EB50047F36B /* heifImage.heif */; }; + 1E9937F727DE2EB50047F36B /* heifImage.heif in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937F027DE2EB50047F36B /* heifImage.heif */; }; + 1E9937F827DE2EB50047F36B /* rawImage.raw in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937F127DE2EB50047F36B /* rawImage.raw */; }; + 1E9937F927DE2EB50047F36B /* rawImage.raw in Resources */ = {isa = PBXBuildFile; fileRef = 1E9937F127DE2EB50047F36B /* rawImage.raw */; }; 334733FC266813EE00DCC49E /* ImageUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FC8F0ED229FB90B00C8D58F /* ImageUtilTests.m */; }; 334733FD266813F100DCC49E /* MetaDataUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 680049252280D736006DD6AB /* MetaDataUtilTests.m */; }; 334733FE266813F400DCC49E /* PhotoAssetUtilTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 68F4B463228B3AB500C25614 /* PhotoAssetUtilTests.m */; }; @@ -65,6 +73,10 @@ /* Begin PBXFileReference section */ 0C7B151765FD4249454C49AD /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 1E9937EE27DE2EB50047F36B /* tiffImage.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = tiffImage.tiff; sourceTree = ""; }; + 1E9937EF27DE2EB50047F36B /* heicImage.heic */ = {isa = PBXFileReference; lastKnownFileType = file; path = heicImage.heic; sourceTree = ""; }; + 1E9937F027DE2EB50047F36B /* heifImage.heif */ = {isa = PBXFileReference; lastKnownFileType = file; path = heifImage.heif; sourceTree = ""; }; + 1E9937F127DE2EB50047F36B /* rawImage.raw */ = {isa = PBXFileReference; lastKnownFileType = file; path = rawImage.raw; sourceTree = ""; }; 334733F22668136400DCC49E /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 334733F62668136400DCC49E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 35AE65F25E0B8C8214D8372B /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -148,6 +160,10 @@ 680049282280E33D006DD6AB /* TestImages */ = { isa = PBXGroup; children = ( + 1E9937EF27DE2EB50047F36B /* heicImage.heic */, + 1E9937F027DE2EB50047F36B /* heifImage.heif */, + 1E9937F127DE2EB50047F36B /* rawImage.raw */, + 1E9937EE27DE2EB50047F36B /* tiffImage.tiff */, 86E9A88F272747B90017E6E0 /* webpImage.webp */, 9FC8F0E8229FA49E00C8D58F /* gifImage.gif */, 680049362280F2B8006DD6AB /* jpgImage.jpg */, @@ -361,10 +377,14 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1E9937F227DE2EB50047F36B /* tiffImage.tiff in Resources */, + 1E9937F827DE2EB50047F36B /* rawImage.raw in Resources */, + 1E9937F427DE2EB50047F36B /* heicImage.heic in Resources */, 86430DF9272D71E9002D9D6C /* gifImage.gif in Resources */, 86E9A894272754A30017E6E0 /* webpImage.webp in Resources */, 86E9A895272769130017E6E0 /* pngImage.png in Resources */, 86E9A896272769150017E6E0 /* jpgImage.jpg in Resources */, + 1E9937F627DE2EB50047F36B /* heifImage.heif in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -372,7 +392,11 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 1E9937F927DE2EB50047F36B /* rawImage.raw in Resources */, 9FC8F0EC229FA68500C8D58F /* gifImage.gif in Resources */, + 1E9937F327DE2EB50047F36B /* tiffImage.tiff in Resources */, + 1E9937F527DE2EB50047F36B /* heicImage.heic in Resources */, + 1E9937F727DE2EB50047F36B /* heifImage.heif in Resources */, 680049382280F2B9006DD6AB /* pngImage.png in Resources */, 680049392280F2B9006DD6AB /* jpgImage.jpg in Resources */, ); diff --git a/packages/image_picker/image_picker/example/ios/RunnerTests/PickerSaveImageToPathOperationTests.m b/packages/image_picker/image_picker/example/ios/RunnerTests/PickerSaveImageToPathOperationTests.m index f94db83d5696..06c652e35613 100644 --- a/packages/image_picker/image_picker/example/ios/RunnerTests/PickerSaveImageToPathOperationTests.m +++ b/packages/image_picker/image_picker/example/ios/RunnerTests/PickerSaveImageToPathOperationTests.m @@ -55,6 +55,46 @@ - (void)testSaveGIFImage API_AVAILABLE(ios(14)) { [self verifySavingImageWithPickerResult:result]; } +- (void)testSaveTIFFImage API_AVAILABLE(ios(14)) { + NSURL *imageURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"tiffImage" + withExtension:@"tiff"]; + NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithContentsOfURL:imageURL]; + PHPickerResult *result = [self createPickerResultWithProvider:itemProvider + withIdentifier:UTTypeWebP.identifier]; + + [self verifySavingImageWithPickerResult:result]; +} + +- (void)testSaveHEICImage API_AVAILABLE(ios(14)) { + NSURL *imageURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"heicImage" + withExtension:@"heic"]; + NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithContentsOfURL:imageURL]; + PHPickerResult *result = [self createPickerResultWithProvider:itemProvider + withIdentifier:UTTypeWebP.identifier]; + + [self verifySavingImageWithPickerResult:result]; +} + +- (void)testSaveHEIFImage API_AVAILABLE(ios(14)) { + NSURL *imageURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"heifImage" + withExtension:@"heif"]; + NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithContentsOfURL:imageURL]; + PHPickerResult *result = [self createPickerResultWithProvider:itemProvider + withIdentifier:UTTypeWebP.identifier]; + + [self verifySavingImageWithPickerResult:result]; +} + +- (void)testSaveRAWImage API_AVAILABLE(ios(14)) { + NSURL *imageURL = [[NSBundle bundleForClass:[self class]] URLForResource:@"rawImage" + withExtension:@"raw"]; + NSItemProvider *itemProvider = [[NSItemProvider alloc] initWithContentsOfURL:imageURL]; + PHPickerResult *result = [self createPickerResultWithProvider:itemProvider + withIdentifier:UTTypeWebP.identifier]; + + [self verifySavingImageWithPickerResult:result]; +} + /** * Creates a mock picker result using NSItemProvider. * diff --git a/packages/image_picker/image_picker/example/ios/TestImages/heicImage.heic b/packages/image_picker/image_picker/example/ios/TestImages/heicImage.heic new file mode 100644 index 000000000000..1ab0bf086cf0 Binary files /dev/null and b/packages/image_picker/image_picker/example/ios/TestImages/heicImage.heic differ diff --git a/packages/image_picker/image_picker/example/ios/TestImages/heifImage.heif b/packages/image_picker/image_picker/example/ios/TestImages/heifImage.heif new file mode 100644 index 000000000000..9f4669cdfba3 Binary files /dev/null and b/packages/image_picker/image_picker/example/ios/TestImages/heifImage.heif differ diff --git a/packages/image_picker/image_picker/example/ios/TestImages/rawImage.raw b/packages/image_picker/image_picker/example/ios/TestImages/rawImage.raw new file mode 100644 index 000000000000..ff8c951f0853 Binary files /dev/null and b/packages/image_picker/image_picker/example/ios/TestImages/rawImage.raw differ diff --git a/packages/image_picker/image_picker/example/ios/TestImages/tiffImage.tiff b/packages/image_picker/image_picker/example/ios/TestImages/tiffImage.tiff new file mode 100644 index 000000000000..76c6140fa613 Binary files /dev/null and b/packages/image_picker/image_picker/example/ios/TestImages/tiffImage.tiff differ diff --git a/packages/image_picker/image_picker/ios/Classes/FLTPHPickerSaveImageToPathOperation.m b/packages/image_picker/image_picker/ios/Classes/FLTPHPickerSaveImageToPathOperation.m index 9e7e7e87a30c..f7eddef55062 100644 --- a/packages/image_picker/image_picker/ios/Classes/FLTPHPickerSaveImageToPathOperation.m +++ b/packages/image_picker/image_picker/ios/Classes/FLTPHPickerSaveImageToPathOperation.m @@ -4,8 +4,8 @@ #import +#import #import "FLTPHPickerSaveImageToPathOperation.h" - API_AVAILABLE(ios(14)) @interface FLTPHPickerSaveImageToPathOperation () @@ -84,16 +84,28 @@ - (void)start { } if (@available(iOS 14, *)) { [self setExecuting:YES]; - - if ([self.result.itemProvider hasItemConformingToTypeIdentifier:UTTypeWebP.identifier]) { - [self.result.itemProvider - loadDataRepresentationForTypeIdentifier:UTTypeWebP.identifier - completionHandler:^(NSData *_Nullable data, - NSError *_Nullable error) { - UIImage *image = [[UIImage alloc] initWithData:data]; - [self processImage:image]; - }]; - return; + NSArray *supportedRepresentations = @[ + UTTypeRAWImage.identifier, + UTTypeTIFF.identifier, + UTTypeBMP.identifier, + UTTypePNG.identifier, + UTTypeHEIF.identifier, + UTTypeHEIC.identifier, + UTTypeJPEG.identifier, + UTTypeWebP.identifier, + UTTypeGIF.identifier, + ]; + for (NSString *identifier in supportedRepresentations) { + if ([self.result.itemProvider hasItemConformingToTypeIdentifier:identifier]) { + [self.result.itemProvider + loadDataRepresentationForTypeIdentifier:identifier + completionHandler:^(NSData *_Nullable data, + NSError *_Nullable error) { + UIImage *image = [[UIImage alloc] initWithData:data]; + [self processImage:image]; + }]; + return; + } } [self.result.itemProvider diff --git a/packages/image_picker/image_picker/pubspec.yaml b/packages/image_picker/image_picker/pubspec.yaml index 553599f7306f..e2a7930b28a0 100755 --- a/packages/image_picker/image_picker/pubspec.yaml +++ b/packages/image_picker/image_picker/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for selecting images from the Android and iOS image library, and taking new pictures with the camera. repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.4+11 +version: 0.8.4+12 environment: sdk: ">=2.14.0 <3.0.0"