2011-07-27 36 views
3

我注意到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,但我需要全分辨率圖像。

最後,即使它工作,異步性質(使用回調塊)也不是我想要的,因爲它使選擇器進程複雜化,無法在我的情況下結束。是否有其他方式從相機膠捲中選取圖像?

回答

0

我在網上找到了一段時間回來這個地方,它的工作原理上的iOS5,並沿着相同的路線,你想要做什麼,希望它有助於

-(void)readExifDataFromSelectedImage:(NSURL *)imageRefURL  
{ 
    void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *) = ^(ALAsset *asset) 
    { 

    }; 

    ALAssetsLibrary *myAssetLib; 
    NSLog(@"%@",imageRefURL); 
    [myAssetLib assetForURL:imageRefURL 
       resultBlock:ALAssetsLibraryAssetForURLResultBlock 
       failureBlock:^(NSError *error){NSLog(@"test:Fail");}]; 
} 




- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    self.referenceURL = [info valueForKey:@"UIImagePickerControllerReferenceURL"]; 
    NSString *mediaType = [info 
          objectForKey:UIImagePickerControllerMediaType]; 
    [self dismissModalViewControllerAnimated:YES]; 
    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
     UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage]; 
     myUIImageView.image = selectedImage; 

     myUIImageView.hidden = NO; 


     [alert release]; 
    } 

}