我注意到 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,但我需要全分辨率图像。
最后,即使它有效,异步特性(使用回调块)也不是我真正想要的,因为它使选取器过程复杂化,在我的情况下没有尽头。有没有其他方法可以从相机胶卷中挑选图像?