【发布时间】:2011-10-14 16:41:45
【问题描述】:
我注意到 UIImagePicker 返回的用于相机胶卷的 NSDictionary 似乎不再返回 UIImagePickerControllerOriginalImage 对象。相反,我得到了一个 UIImageControllerReferenceURL,要求我使用 ALAAssetLibrary 的assetForURL 通过一个漫长而复杂的过程来创建一个 UIImage。
网上有足够多的例子,都非常相似,我已经实现了,但是在创建 ALARepresentation 对象后,调用它的任何方法都会导致 EXC_BAD_ACCESS 异常,所以我无法检索图像。有谁知道获取“原始图片”而不是“参考网址”的方法,或者这种行为是否已被默默弃用?
注意:我在 iOS 5(因为我喜欢内存管理)和 Xcode 4.2 下工作以实现情节提要功能。回到早期版本似乎是不可能的。代码如下所示:
// in the header
#import <AssetsLibrary/AssetsLibtrary.h>
typedef void (^ALAAssetsLibraryAssetForURLReferenceBlock)(ALAAsset *asset);
typedef void (^AlAAssetsLibraryAccessForFailureBlock)(NSError *error);
// in the implementation
-(void) ImagePickerController:(UIImagePickerController*)picker
didFinishPickingMediaWithInfo:(NSDictionary*)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if (mediaType isEqualToString:(NSString*)kUTTypeImage]) {
NSURL *url = [info objectForKey:UIImagePickerControllerReferenceURL];
if (url) {
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *asset) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
if (iref) {
UIImage *image = [UIImage imageWithCGImage:iref];
[self displayImage:image];
}
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error) {
// handle error
};
ALAssetsLibrary *assetsLib = [[ALAssetLibrary alloc]init];
[assetsLib assetForURL:url resultBlock:resultblock failureBlock:failureblock];
}
}
}
EXC_BAD_ACCESS 发生在试图创建 CGImageRef 的那一行。我尝试了其他 *rep 方法(包括元数据);这些也抛出异常。唯一“有效”的是从资产中获取缩略图 CGImageRef,但我需要全分辨率图像。
最后,即使它有效,异步特性(使用回调块)也不是我真正想要的,因为它使选择器过程复杂化,在我的情况下没有尽头。有没有其他方法可以从相机胶卷中挑选图像?
【问题讨论】:
标签: uiimagepickercontroller ios5 alassetslibrary