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