我注意到UIImagePicker爲Camera Roll返回的NSDictionary似乎不再返回UIImagePickerControllerOriginalImage對象。相反,我得到一個UIImageControllerReferenceURL,要求我使用ALAAssetLibrary的assetForURL通過一個漫長而涉及的過程來創建一個UIImage。UIImagePicker和ALAAssetRepresentation在iOS5中的問題
在Web上有足夠的例子,所有這些都非常類似,我已經實現了,但是在創建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,但我需要全分辨率圖像。
最後,即使它工作,異步性質(使用回調塊)也不是我想要的,因爲它使選擇器進程複雜化,無法在我的情況下結束。是否有其他方式從相機膠捲中選取圖像?