// Если вы читаете это, посмотрите на комментарии ниже и подумаете «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];
Мы можем оставить это упражнение для пользователя.
Удачи, надеюсь, это поможет вам разобраться.