Проблема UIImagePicker и ALAAssetRepresentation в iOS5 - PullRequest
3 голосов
/ 28 июля 2011

Я заметил, что NSDictionary, возвращаемый UIImagePicker для Camera Roll, похоже, больше не возвращает объект UIImagePickerControllerOriginalImage. Вместо этого я получаю UIImageControllerReferenceURL, требуя от меня использовать assetForURL ALAAssetLibrary для создания UIImage через длинный и сложный процесс.

В сети достаточно примеров этого, все они удивительно похожи, которые я реализовал, но после создания объекта ALARepresentation вызов любого из его методов вызывает исключение EXC_BAD_ACCESS, поэтому я не могу получить изображение. Кто-нибудь знает способ вернуть «исходное изображение», а не «ссылочный URL-адрес», или это поведение молча устарело?

ПРИМЕЧАНИЕ: я работаю под 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 из ресурса, но мне нужно изображение с полным разрешением.

Наконец, даже если это сработало, асинхронная природа (с использованием блоков обратного вызова) не совсем то, что я хочу, так как это усложняет процесс выбора без конца в моем случае. Есть ли другой способ выбрать изображение с камеры?

1 Ответ

0 голосов
/ 26 сентября 2011

Некоторое время назад я нашел это где-то в сети, он работает на 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];
    }

}
...