// Если вы читаете это и смотрите на комментарии ниже и думаете ?? WTF ?? это потому, что я редактирую свой исходный ответ, а не отправляю два ответа в надежде, что все станет чище. Важно знать, что ALAssetsLibrary относится к iOS 4.x.
Приведенный ниже код будет работать, чтобы получить URL-адрес библиотеки ресурсов, а затем создать UIImage из представления эскиза. Хотя я использую URL-адрес библиотеки ресурсов напрямую, нет причин, по которым этот же код не может начинаться с преобразования строкового представления в NSURL, чтобы удовлетворить присваиванию imageURL
. Отказ от ответственности: этот код, вероятно, протекает или что-то еще хуже, но он отвечает на вопрос исходного автора и, надеюсь, представляет ценность.
Приведенный ниже код сильно заимствован из вопроса о переполнении стека, который охватывает в основном ту же тему. В дополнение к приведенному здесь коду я включил 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];
Мы можем оставить это упражнение для пользователя.
Удачи, надеюсь, это поможет вам прояснить ситуацию.
person
Walter
schedule
12.01.2011