显示从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
和
他们稍微弯曲了一下,但是如果你把它们看作是通知选择器或者回调函数的话,这种方法是有帮助的。
也
- 当
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;