| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- // Copyright 2019 The Flutter Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #import "FLTImagePickerPhotoAssetUtil.h"
- #import "FLTImagePickerImageUtil.h"
- #import "FLTImagePickerMetaDataUtil.h"
- #import <MobileCoreServices/MobileCoreServices.h>
- @implementation FLTImagePickerPhotoAssetUtil
- + (PHAsset *)getAssetFromImagePickerInfo:(NSDictionary *)info {
- if (@available(iOS 11, *)) {
- return [info objectForKey:UIImagePickerControllerPHAsset];
- }
- NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
- if (!referenceURL) {
- return nil;
- }
- PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithALAssetURLs:@[ referenceURL ]
- options:nil];
- return result.firstObject;
- }
- + (NSString *)saveImageWithOriginalImageData:(NSData *)originalImageData
- image:(UIImage *)image
- maxWidth:(NSNumber *)maxWidth
- maxHeight:(NSNumber *)maxHeight
- imageQuality:(NSNumber *)imageQuality {
- NSString *suffix = kFLTImagePickerDefaultSuffix;
- FLTImagePickerMIMEType type = kFLTImagePickerMIMETypeDefault;
- NSDictionary *metaData = nil;
- // Getting the image type from the original image data if necessary.
- if (originalImageData) {
- type = [FLTImagePickerMetaDataUtil getImageMIMETypeFromImageData:originalImageData];
- suffix =
- [FLTImagePickerMetaDataUtil imageTypeSuffixFromType:type] ?: kFLTImagePickerDefaultSuffix;
- metaData = [FLTImagePickerMetaDataUtil getMetaDataFromImageData:originalImageData];
- }
- if (type == FLTImagePickerMIMETypeGIF) {
- GIFInfo *gifInfo = [FLTImagePickerImageUtil scaledGIFImage:originalImageData
- maxWidth:maxWidth
- maxHeight:maxHeight];
- return [self saveImageWithMetaData:metaData gifInfo:gifInfo suffix:suffix];
- } else {
- return [self saveImageWithMetaData:metaData
- image:image
- suffix:suffix
- type:type
- imageQuality:imageQuality];
- }
- }
- + (NSString *)saveImageWithPickerInfo:(nullable NSDictionary *)info
- image:(UIImage *)image
- imageQuality:(NSNumber *)imageQuality {
- NSDictionary *metaData = info[UIImagePickerControllerMediaMetadata];
- return [self saveImageWithMetaData:metaData
- image:image
- suffix:kFLTImagePickerDefaultSuffix
- type:kFLTImagePickerMIMETypeDefault
- imageQuality:imageQuality];
- }
- + (NSString *)saveImageWithMetaData:(NSDictionary *)metaData
- gifInfo:(GIFInfo *)gifInfo
- suffix:(NSString *)suffix {
- NSString *path = [self temporaryFilePath:suffix];
- return [self saveImageWithMetaData:metaData gifInfo:gifInfo path:path];
- }
- + (NSString *)saveImageWithMetaData:(NSDictionary *)metaData
- image:(UIImage *)image
- suffix:(NSString *)suffix
- type:(FLTImagePickerMIMEType)type
- imageQuality:(NSNumber *)imageQuality {
- NSData *data = [FLTImagePickerMetaDataUtil convertImage:image
- usingType:type
- quality:imageQuality];
- if (metaData) {
- data = [FLTImagePickerMetaDataUtil updateMetaData:metaData toImage:data];
- }
- return [self createFile:data suffix:suffix];
- }
- + (NSString *)saveImageWithMetaData:(NSDictionary *)metaData
- gifInfo:(GIFInfo *)gifInfo
- path:(NSString *)path {
- CGImageDestinationRef destination = CGImageDestinationCreateWithURL(
- (CFURLRef)[NSURL fileURLWithPath:path], kUTTypeGIF, gifInfo.images.count, NULL);
- NSDictionary *frameProperties = [NSDictionary
- dictionaryWithObject:[NSDictionary
- dictionaryWithObject:[NSNumber numberWithFloat:gifInfo.interval]
- forKey:(NSString *)kCGImagePropertyGIFDelayTime]
- forKey:(NSString *)kCGImagePropertyGIFDictionary];
- NSMutableDictionary *gifMetaProperties = [NSMutableDictionary dictionaryWithDictionary:metaData];
- NSMutableDictionary *gifProperties =
- (NSMutableDictionary *)gifMetaProperties[(NSString *)kCGImagePropertyGIFDictionary];
- if (gifMetaProperties == nil) {
- gifProperties = [NSMutableDictionary dictionary];
- }
- gifProperties[(NSString *)kCGImagePropertyGIFLoopCount] = [NSNumber numberWithFloat:0];
- CGImageDestinationSetProperties(destination, (CFDictionaryRef)gifMetaProperties);
- for (NSInteger index = 0; index < gifInfo.images.count; index++) {
- UIImage *image = (UIImage *)[gifInfo.images objectAtIndex:index];
- CGImageDestinationAddImage(destination, image.CGImage, (CFDictionaryRef)frameProperties);
- }
- CGImageDestinationFinalize(destination);
- CFRelease(destination);
- return path;
- }
- + (NSString *)temporaryFilePath:(NSString *)suffix {
- NSString *fileExtension = [@"image_picker_%@" stringByAppendingString:suffix];
- NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString];
- NSString *tmpFile = [NSString stringWithFormat:fileExtension, guid];
- NSString *tmpDirectory = NSTemporaryDirectory();
- NSString *tmpPath = [tmpDirectory stringByAppendingPathComponent:tmpFile];
- return tmpPath;
- }
- + (NSString *)createFile:(NSData *)data suffix:(NSString *)suffix {
- NSString *tmpPath = [self temporaryFilePath:suffix];
- if ([[NSFileManager defaultManager] createFileAtPath:tmpPath contents:data attributes:nil]) {
- return tmpPath;
- } else {
- nil;
- }
- return tmpPath;
- }
- @end
|