从iPhone中的ALAsset检索到的URL显示图像 [英] display image from URL retrieved from ALAsset in iPhone

查看:126
本文介绍了从iPhone中的ALAsset检索到的URL显示图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using a ALAsset Framework for accessing the files in the device's photo gallery.

到目前为止,我可以访问缩略图并显示它。

我想在图像视图中显示实际图像,但我无法弄清楚如何执行此操作。

So far I am able to access the thumbnail and display it.
I want to display the actual image in an image view but I am unable to figure out how to do this.

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

I tried using the URLs field in the ALAsset object but was unsuccessful.

任何人都知道这是怎么回事做了什么?

Anybody knows how this can be done?

这里有一些代码,我可以访问缩略图并将其放在表格单元格中:

Here's some code where I was able to access the thumbnail and place it in a table cell:

- (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。

The API has changed the rules slightly and you dont get direct file system access to the iPhoto library any more. Instead you get asset library URL's like this.

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

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

You use the ALAssetLibrary object to access the ALAsset object via the URL.

所以从ALAssetLibrary的文档中将其抛入标题(或您的来源)

so from the docs for ALAssetLibrary throw this in a header (or your source)

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

这不是严格需要的,但要保持漂亮。

然后在你的来源。

which isnt strictly needed but keeps things pretty.
and then in your source.

-(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移植之前,这对我来说是新的,但你可能想看看

A couple of things to note are that this uses blocks which were new to me before I started my iOS4 porting but you might like to look at

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

他们稍微弯曲了一下,但如果你认为它们是通知选择器或回调,它会有所帮助。

They bend your head a little but if you think of them as notification selectors or callbacks it kind of helps.

另外


  • findLargeImage 返回
    结果块时还没有运行它的
    a回调。所以largeImage不会是
    有效。

  • largeImage 需要是一个
    实例变量,其范围不是
    方法。

  • when findLargeImage returns the resultblock wont have run yet as its a callback. So largeImage wont be valid yet.
  • largeImage needs to be an instance variable not scoped to the method.

我在使用该方法时使用此构造执行此操作,但您可能会找到更适合您使用的内容。

I use this construct to do this when using the method but you may find something more suitable to your use.

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

这就是我在尝试获得这个时学到的东西无论如何工作。

Thats what I learned while trying to get this working anyway.

iOS 5更新

当结果块触发似乎iOS5& amp慢一点可能是单核设备,因此在调用 findLargeImage 后,我无法直接使用该图像。因此,我将其更改为呼叫代理人。

When the result block fires seems to be a bit slower with iOS5 & maybe single core devices so I couldnt rely on the image to be available directly after calling findLargeImage. So I changed it to call out to a delegate.

@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];
        }
    };

这篇关于从iPhone中的ALAsset检索到的URL显示图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆