3

UIImagePicker for Camera Rollによって返されるNSDictionaryは、UIImagePickerControllerOriginalImageオブジェクトを返さなくなったようです。代わりに、UIImageControllerReferenceURLを取得し、ALAAssetLibraryのassetForURLを使用して、長くて複雑なプロセスを通じてUIImageを作成する必要があります。

Webにはこれの例が十分にあり、すべて非常によく似ていますが、ALARepresentationオブジェクトを作成した後、そのメソッドのいずれかを呼び出すとEXC_BAD_ACCESS例外が発生するため、画像を取得できません。「参照URL」ではなく「元の画像」を取り戻す方法を知っている人はいますか、それともこの動作は黙って非推奨になっていますか?

注:ストーリーボード機能として、 iOS 5(メモリ管理が好きなため)とXcode4.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 に答える