我可以从URL加载UIImage吗?

141

我有一张图片的URL(从UIImagePickerController获取),但是我不再拥有内存中的图片(该URL是从应用程序上一次运行中保存的)。我能够通过这个URL重新加载UIImage吗?

我看到UIImage有一个imageWithContentsOfFile:方法,但我有一个URL。我可以使用NSData的dataWithContentsOfURL:方法读取URL吗?

编辑1


根据@Daniel的答案,我尝试了以下代码,但它没有起作用...

NSLog(@"%s %@", __PRETTY_FUNCTION__, photoURL);     
if (photoURL) {
    NSURL* aURL = [NSURL URLWithString:photoURL];
    NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
    self.photoImage = [UIImage imageWithData:data];
    [data release];
}

当我运行它时,控制台显示:

-[PhotoBox willMoveToWindow:] file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG
*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0'

查看调用堆栈,我调用了URLWithString,它又调用了URLWithString:relativeToURL:,然后是initWithString:relativeToURL:,然后是_CFStringIsLegalURLString,然后是CFStringGetLength,然后是forwarding_prep_0,然后是forwarding,最后是-[NSObject doesNotRecognizeSelector]。

有什么想法,为什么我的NSString(photoURL的地址是0x536fbe0)不响应length呢?为什么它说不响应-[NSURL length]?它难道不知道param是一个NSString而不是NSURL吗?

编辑2


好的,代码唯一的问题就在于字符串到URL的转换。如果我直接硬编码字符串,其他所有东西都能正常工作。所以我的NSString似乎有问题,如果我找不出原因,那么我猜这应该作为另一个问题提出。加入以下这行代码(我从上面的控制台日志中复制了路径),它可以正常工作:

photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";

看起来photoURL已经是NSURL,而不是NSString,因为NSLog已经处理了它。 - drawnonward
@drawn:文档似乎有错误。它说UIImagePickerControllerMediaURL是一个NSString,但实际上是一个NSURL对象。 - progrmr
DLImageLoader这个库真是太厉害了,非常稳定,没有文档,只需一个命令,一切都完美无缺。真是太棒了! - Fattie
我也推荐DLImageLoader。一开始我对这个页面上的评论是否客观持怀疑态度,但我还是试了一下,它确实非常好用。我有一个UITableViewCell中的UIImageView。我所做的就是用DLImageView替换UIImageView,然后调用imageFromUrl:方法来加载图像,一切都很顺利——异步加载、缓存等等。再也没有比这更简单的了。 - itnAAnti
DLImageLoader仍然很棒,另一个不错的选择是Haneke,尽管它有点因为没有得到很好的维护而受到影响。 - Fattie
所有这些回复都没有真正回答你的问题,你只需要处理本地路径,不需要使用所有这些复杂的异步方法,请看下面我的回答。 - Peter Suwara
12个回答

0

通过以下代码,加载URL图片的最佳且简单的方法是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSData *data =[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]];

    dispatch_async(dispatch_get_main_queue(), ^{
        imgView.image= [UIImage imageWithData:data];
    });
});

imgUrl替换为您的ImageURL
imgView替换为您的UIImageView

它会在另一个线程中加载图像,因此不会减慢您的应用程序加载速度。


0
本地网址非常简单,只需使用此代码:


UIImage(contentsOfFile: url.path)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接