Как получить миниатюр или сберегаемый путь от uiimagepickercontroller для использования для Uiimageview?

StackOverflow https://stackoverflow.com/questions/4663019

Вопрос

Может ли кто -нибудь объяснить или показать какой -то образец кода того, как я могу использовать миниатюр, который будет помещен в Uiimageview после того, как пользователь выбирает фотографию с UiimagePickerController?

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

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

Это было полезно?

Решение

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

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

Приведенный ниже код заимствует на tего стек переполнен Это охватывает в основном эта же тема. В дополнение к коду, я включил AssetSlibrary.framework и Alassetslibrary Typedefs, на которые ссылаются в другой вопрос.

Весь трюк заключается в том, что вы не можете ссылаться на 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];

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

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

Другие советы

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

В делегате для 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

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

  1. По крайней мере, в iOS 4.x URL -адреса не гарантированно не будут уникальными. Их можно использовать повторно, если пользователь удаляет/добавляет изображения, что, очевидно, является общим. Итак, URL, который вы сохранили, может указать на другую картину в будущем!
  2. Когда пользователь обновляет iOS 5, URL -адреса больше не действительны. ФУ!!! Apple переписана библиотека фото, без обратной совместимости.

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

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

// Здесь «профилефотосекции» - это изображение, которое вы получаете от сборщика в качестве аргумента в вашем методе Callabck

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top