显示从iPhone中的ALAsset中检索的URL的图像

我正在使用ALAsset框架来访问设备照片库中的文件。

到目前为止,我可以访问缩略图并显示它。
我想显示图像视图中的实际图像,但我无法弄清楚如何做到这一点。

我尝试使用ALAsset对象中的URL字段,但不成功。

有人知道如何做到这一点?

以下是我能够访问缩略图的一些代码,并将其放在表格单元格中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } //here 'asset' represents the ALAsset object asset = [assets objectAtIndex:indexPath.row]; //i am accessing the thumbnail here [cell.imageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]]; [cell.textLabel setText:[NSString stringWithFormat:@"Photo %d", indexPath.row+1]]; return cell; } 

API稍微改变了一些规则,你不再可以直接访问iPhoto图库。 相反,你得到这样的资产库URL。

assets-library://asset/asset.JPG?id=1000000003&ext=JPG

您可以使用ALAssetLibrary对象通过URL访问ALAsset对象。

所以从ALAssetLibrary的文档把这个在头(或你的源)

 typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset); typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error); 

这不是严格需要,但保持漂亮。
然后在你的来源。

 -(void)findLargeImage { NSString *mediaurl = [self.node valueForKey:kVMMediaURL]; // ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { ALAssetRepresentation *rep = [myasset defaultRepresentation]; CGImageRef iref = [rep fullResolutionImage]; if (iref) { largeimage = [UIImage imageWithCGImage:iref]; [largeimage retain]; } }; // ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror) { NSLog(@"booya, cant get image - %@",[myerror localizedDescription]); }; if(mediaurl && [mediaurl length] && ![[mediaurl pathExtension] isEqualToString:AUDIO_EXTENSION]) { [largeimage release]; NSURL *asseturl = [NSURL URLWithString:mediaurl]; ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease]; [assetslibrary assetForURL:asseturl resultBlock:resultblock failureBlock:failureblock]; } } 

需要注意的是,在开始我的iOS4移植之前,这使用了对我来说是新的块,但是您可能想看看

https://www.mikeash.com/pyblog/friday-qa-2008-12-26.html

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

他们稍微弯曲了一下,但是如果你把它们看作是通知选择器或者回调函数的话,这种方法是有帮助的。

  • findLargeImage返回的结果块将不会作为其回调运行。 所以largeImage不会是有效的。
  • largeImage需要是一个实例变量,而不是该方法的作用域。

使用这个方法时,我使用这个构造来做到这一点,但是你可能会发现更适合你的东西。

 [node.view findLargeImage]; UIImage *thumb = node.view.largeImage; if (thumb) { blah blah } 

多数民众赞成在我试图得到这个工作无论如何学习。

iOS 5更新

当结果块触发似乎有点慢iOS5和也许单核心设备,所以我不能依靠图像调用findLargeImage后直接可用。 所以我把它改成了一个委托。

 @protocol HiresImageDelegate <NSObject> @optional -(void)hiresImageAvailable:(UIImage *)aimage; @end 

和commecá

 // ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { ALAssetRepresentation *rep = [myasset defaultRepresentation]; CGImageRef iref = [rep fullResolutionImage]; if (iref) { UIImage *largeimage = [UIImage imageWithCGImage:iref]; [delegate hiresImageAvailable:large]; } }; 

沃伦的回答对我很好。 对于某些人来说,一个有用的东西是同时包含图像方向和缩放元数据。 你在结果块中这样做:

 ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset) { ALAssetRepresentation *rep = [myasset defaultRepresentation]; CGImageRef iref = [rep fullResolutionImage]; if (iref) { UIImage *largeimage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]]; [delegate hiresImageAvailable:large]; } }; 

在这种情况下, imageWIthCGImage调用在为您创建UIImage时添加了缩放和orientation

 [UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]]; 

要注意的一个技巧是,如果在iOS 5上使用[rep fullScreenImage]而不是[rep fullResolutionImage] ,则会得到一个已经旋转的图像 – 但是在iPhone屏幕的分辨率下 – 即其分辨率较低。

只要把沃伦和奥克诺克斯的答案结合成一个短小的片段即可:

 ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary assetForURL:self.selectedPhotos[i] resultBlock: ^(ALAsset *asset){ ALAssetRepresentation *representation = [asset defaultRepresentation]; CGImageRef imageRef = [representation fullResolutionImage]; if (imageRef) { UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; imageView.image = [UIImage imageWithCGImage:imageRef scale:representation.scale orientation:representation.orientation]; // ... } } failureBlock: ^{ // Handle failure. }]; 

我个人喜欢设置我的failureBlock nil

  NSURL* aURL = [NSURL URLWithString:@"URL here"]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library assetForURL:aURL resultBlock:^(ALAsset *asset) { UIImage *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:0.5 orientation:UIImageOrientationUp]; cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage]; } failureBlock:^(NSError *error) { // error handling NSLog(@"failure-----"); }]; 

只要提供您在上面提供的光盘库中的图像的UIReferenceURl …它的工作正常。 。 我把它放进去了

  • UIcollectionView单元格

    如果你只是想显示在一个

  • 的UIImageView

    手段

更改

 cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage]; 

 imageView.image = copyOfOriginalImage;