//如果您正在阅读本文并查看下面的评论并思考??WTF??这是因为我正在编辑我的原始答案而不是发布两个答案,希望事情会更干净。重要的是要知道 ALAssetsLibrary 是 iOS 4.x 的东西。
下面的代码将用于获取资产库 URL,然后从缩略图表示中生成 UIImage。虽然我直接使用资产库 url,但没有理由不能通过将字符串表示形式转换为 NSURL 来满足imageURL
分配的相同代码。免责声明:此代码可能会泄漏或更糟,但它回答了原始发布者的问题,并希望具有价值。
下面的代码大量借鉴了他的 Stack Overflow 问题,该问题基本上涵盖了相同的主题。除了这里的代码,我还包括了 AssetsLibrary.framework 和另一个问题中引用的 ALAssetsLibrary typedef。
整个技巧是您不能直接从资产库中引用 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];
我们可以把这个练习留给用户。
祝你好运,希望这有助于为你解决问题。