Как получить миниатюр или сберегаемый путь от uiimagepickercontroller для использования для Uiimageview?
-
10-10-2019 - |
Вопрос
Может ли кто -нибудь объяснить или показать какой -то образец кода того, как я могу использовать миниатюр, который будет помещен в 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 может быть проблематичной:
- По крайней мере, в iOS 4.x URL -адреса не гарантированно не будут уникальными. Их можно использовать повторно, если пользователь удаляет/добавляет изображения, что, очевидно, является общим. Итак, URL, который вы сохранили, может указать на другую картину в будущем!
- Когда пользователь обновляет 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