从iPhone中的ALAsset检索到的URL显示图像 [英] display image from URL retrieved from ALAsset in iPhone
问题描述
我正在使用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
和
他们稍微弯曲了一下,但如果你认为它们是通知选择器或回调,它会有所帮助。
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屋!