【问题标题】:UIImagePicker and ALAAssetRepresentation problem in iOS5iOS5中的UIImagePicker和ALAAssetRepresentation问题
【发布时间】: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


    【解决方案1】:

    不久前我在网上的某个地方发现了这个,它适用于 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];
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多