Как получить миниатюру или сохраняемый путь из UIImagePickerController для использования для UIImageView? - PullRequest
8 голосов
/ 12 января 2011

Может кто-нибудь объяснить или показать пример кода того, как я могу получить эскиз, чтобы поместить его в UIImageView после того, как пользователь выберет фотографию с помощью UIImagePickerController?

Допустим, я хочу установить эскиз в качестве изображения ячейки табличного представления. Когда пользователь нажимает на ячейку, отображается средство выбора изображения, и пользователь выбирает изображение, которое уже находится на его устройстве. Я также хочу сохранить путь к этой миниатюре, чтобы при следующем отображении представления можно было отобразить соответствующую миниатюру.

Я могу отобразить средство выбора изображений, и мой делегат правильно получает выбранное изображение, но мне нужен путь к миниатюре, и я хочу загрузить миниатюру, используя этот путь (т.е. я хочу сохранить путь). Я искал часы сегодня и не понял этого. Возможно, я не понимаю ALAsset, или, может быть, это что-то еще, но я не могу найти примеры, которые мне помогают. Я никогда раньше не использовал средство выбора изображений или ALAsset, поэтому я совершенно новичок в этом.

Ответы [ 4 ]

15 голосов
/ 12 января 2011

// Если вы читаете это, посмотрите на комментарии ниже и подумаете «WTF» это потому, что я редактирую свой оригинальный ответ вместо того, чтобы публиковать два ответа в надежде, что все будет чище. Важно знать, что ALAssetsLibrary - это вещь для iOS 4.x.

Приведенный ниже код будет функционировать для получения URL-адреса библиотеки активов, а затем для создания UIImage из миниатюрного представления. Хотя я использую URL-адрес библиотеки ресурсов напрямую, нет причины, по которой этот же код не может быть начат с преобразования строкового представления в NSURL для выполнения присваивания imageURL. Отказ от ответственности: этот код, вероятно, утечка или что-то еще хуже, но он отвечает на вопрос оригинального плаката и, надеюсь, имеет значение.

Приведенный ниже код в значительной степени заимствует t его вопрос переполнения стека , который охватывает в основном ту же тему. В дополнение к приведенному здесь коду я включил AssetsLibrary.framework и определения типа ALAssetsLibrary, указанные в другом вопросе.

Весь трюк в том, что вы не можете напрямую ссылаться на NSURL из библиотеки ресурсов. Я думаю (хотя я не знаю), что он каким-то образом ссылается на хранилище данных вместо файла, поэтому данные, возвращаемые из URL, не являются прямыми NSData, поэтому вы не можете использовать его по-старому.

В коде есть UIImageView, который называется photo. Надеюсь, все остальное легко понять.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
    NSLog(@"%@",imageURL);
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        CGImageRef iref = [myasset thumbnail];
        if (iref) {
            UIImage *theThumbnail = [UIImage imageWithCGImage:iref];
            [[self photo] setImage:theThumbnail];

        }
    };


    ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    {
        NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
    };

    if(imageURL)
    {
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:imageURL 
                       resultBlock:resultblock
                      failureBlock:failureblock];
    }

    [self dismissModalViewControllerAnimated:YES];
}

Если вам не нужен эскиз, но нужна полная фотография, вы просто измените код в блоке AssetForURLResult на что-то вроде этого:

       ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];

Мы можем оставить это упражнение для пользователя.

Удачи, надеюсь, это поможет вам разобраться.

2 голосов
/ 13 января 2011

Я понял это сейчас.Трудность, с которой я столкнулся, заключалась в понимании блоков, в основном синтаксис блоков затруднил понимание того, что они из себя представляют и как они работают.

В делегате UIImagePickerController, когда пользователь выбрал изображение, вы можетепуть к изображению в библиотеке ресурсов, используя:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL];

С этим объектом вы можете получить полноразмерное изображение или миниатюру, используя следующий код:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    if (iref) {
        // Gets the full size image
        self.fullSizeImage = [UIImage imageWithCGImage:iref];
    }

    // Gets the thumbnail
    self.thumbnail = [UIImage imageWithCGImage:[myasset thumbnail]];
};

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
    NSLog(@"in failureblock, got an error: %@",[myerror localizedDescription]);
};

ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
[assetsLib assetForURL:urlForImage resultBlock:resultblock failureBlock:failureblock];

Эта страницадействительно помог мне понять блоки: блоки в iOS 4
См. также отображение изображения с URL-адреса, полученного из ALAsset в iPhone

1 голос
/ 17 декабря 2011

Сохранение URL может быть проблематичным:

  1. по крайней мере в iOS 4.x, URL не гарантированно будут уникальными. Их можно использовать повторно, если пользователь удаляет / добавляет изображения, что, очевидно, является обычным явлением. Таким образом, сохраненный вами URL может указывать на другую картинку в будущем!
  2. Когда пользователь обновляет iOS 5, URL-адреса больше не действительны. UGH !!! Apple переписала Photo Library без обратной совместимости.
0 голосов
/ 12 января 2011

Вы можете сохранить изображение, которое вы выбираете из imagePicker, в Каталог документов, чтобы ссылаться на него из средства выбора. Вот код, который вы можете использовать для сохранения изображения. Реализуйте этот метод в методе обратного вызова, который вызывается, когда пользователь выбирает фотографию из средства выбора

 NSFileManager   fileManager    = [NSFileManager defaultManager];

    NSArray*  output_PDF_paths  =  NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString* output_PDF_documentsDirectory = [output_PDF_paths objectAtIndex:0];
    NSString* output_PDF_ABSOLUTE_PATH  = [output_PDF_documentsDirectory stringByAppendingPathComponent:@"ImageName.png"];  

    BOOL success_new = [UIImagePNGRepresentation(ProfilePhotoselected) writeToFile:previewPagePath atomically:YES];

// Здесь "ProfilePhotoselected" - это изображение, которое вы получаете из средства выбора в качестве аргумента в вашем методе callabck

...