iOS AssetsLibrary和Photos的使用总结(2): 原图获取

本文介绍了如何在iOS应用中使用AssetsLibrary和Photos框架来获取原图,提供了一个源码下载链接,适用于iOS7及更高版本的系统。通过封装这两个库的API,可以方便地实现图片选择功能。

源码下载:https://github.com/darling0825/DLPhotoPicker.git
封装了AssetsLibrary和Photos的API,支持iOS7和iOS8以上

- (UIImage *)originImage
{
    @autoreleasepool {
        if (_originImage) {
            return _originImage;
        }

        __block UIImage *resultImage;

        if (UsePhotoKit) {
            //  image after edited
            PHImageRequestOptions *originRequestOptions = [[PHImageRequestOptions alloc] init];
            originRequestOptions.version = PHImageRequestOptionsVersionCurrent;
            originRequestOptions.networkAccessAllowed = YES;
            originRequestOptions.synchronous = YES;

            //sync requests are automatically processed this way regardless of the specified mode
            //originRequestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

            originRequestOptions.progressHandler = ^(double progress, NSError *__nullable error, BOOL *stop, NSDictionary *__nullable info){
                dispatch_main_async_safe(^{

                });
            };

            [[[DLPhotoManager sharedInstance] phCachingImageManager]
            requestImageForAsset:self.phAsset
            targetSize:PHImageManagerMaximumSize
            contentMode:PHImageContentModeDefault
            options:originRequestOptions
            resultHandler:^(UIImage *result, NSDictionary *info) {
                @autoreleasepool {                                                                  
                    BOOL downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey] && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue] && result;
                    if (downloadFinined) {
                        resultImage = result;
                    }
                }
            ];
        } else {
            CGImageRef fullResolutionImageRef = [[self.alAsset defaultRepresentation] fullResolutionImage];
            NSString *adjustment = [[[self.alAsset defaultRepresentation] metadata] objectForKey:@"AdjustmentXMP"];
            if (adjustment) {
                NSData *xmpData = [adjustment dataUsingEncoding:NSUTF8StringEncoding];
                CIImage *tempImage = [CIImage imageWithCGImage:fullResolutionImageRef];

                NSError *error;
                NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData
                                                             inputImageExtent:tempImage.extent
                                                                        error:&error];
                CIContext *context = [CIContext contextWithOptions:nil];
                if (filterArray && !error) {
                    for (CIFilter *filter in filterArray) {
                        [filter setValue:tempImage forKey:kCIInputImageKey];
                        tempImage = [filter outputImage];
                    }
                    fullResolutionImageRef = [context createCGImage:tempImage fromRect:[tempImage extent]];
                }
            }
            resultImage = [UIImage imageWithCGImage:fullResolutionImageRef scale:[[self.alAsset defaultRepresentation] scale] orientation:(UIImageOrientation)[[self.alAsset defaultRepresentation] orientation]];
        }

        _originImage = resultImage;
        return resultImage;
    }
}

- (NSInteger)requestOriginImageWithCompletion:(void (^)(UIImage *, NSDictionary *))completion
                          withProgressHandler:(PHAssetImageProgressHandler)phProgressHandler
{
    @autoreleasepool {
        if (UsePhotoKit) {
            if (_originImage) {
                dispatch_main_async_safe(^{
                    if (completion) {
                        completion(_originImage, nil);
                    }
                })
                return 0;
            } else {
                PHImageRequestOptions *originRequestOptions = [[PHImageRequestOptions alloc] init];
                originRequestOptions.version = PHImageRequestOptionsVersionCurrent;
                originRequestOptions.networkAccessAllowed = YES;
                originRequestOptions.progressHandler = phProgressHandler;
                self.imageRequestID = [[[DLPhotoManager sharedInstance] phCachingImageManager]
                                       requestImageForAsset:self.phAsset
                                       targetSize:PHImageManagerMaximumSize
                                       contentMode:PHImageContentModeDefault
                                       options:originRequestOptions
                                       resultHandler:^(UIImage *result, NSDictionary *info) {
                                               BOOL downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey] && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue];

                                               if (downloadFinined) {
                                                   _originImage = result;
                                               }
                                               if (completion) {
                                                   completion(result, info);
                                               }
                                           }
                                       }];

                return self.imageRequestID;
            }
        } else {
            dispatch_main_async_safe(^{
                if (completion) {
                    completion([self originImage], nil);
                }
            })
            return 0;
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值