3

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

最后,即使它有效,异步特性(使用回调块)也不是我真正想要的,因为它使选取器过程复杂化,在我的情况下没有尽头。有没有其他方法可以从相机胶卷中挑选图像?

4

1 回答 1

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];
    }

}
于 2011-09-26T14:46:08.473 回答