当下载进度较慢时,如何在UIImageView中显示渐进式JPEG图像?

8

从网络上下载一张图片并在UIImageView中显示它是相当容易的。然而,这需要在将图像显示给用户之前完全下载图像,完全破坏了渐进式JPEG(和PNG)图像。

在传输过程中如何呈现部分下载的图像?我想SDK应该有一些回调函数来更新图像,但我找不到这样的函数。在当前的iOS SDK中是否可能实现这一点?

3个回答

10
我知道这篇文章已经有大约一年的时间了,但以防万一有人在寻找它,有一个名为NYXImagesKit 的项目可以达到你要求的效果。
它拥有一个名为NYXProgressiveImageView 的类,是UIImageView的子类。
你需要做的就是:
NYXProgressiveImageView * imgv = [[NYXProgressiveImageView alloc] init];
imgv.frame = CGRectMake(0, 0, 320, 480);
[imgv loadImageAtURL:[NSURL URLWithString:@"http://yourimage"]];
[self.view addSubview:imgv];
[imgv release];

另外,一个好的选择是将您的图像保存为隔行扫描,以便以低质量加载并随着下载而改进。如果图像没有隔行扫描,则从顶部到底部加载。


1
谢谢,我不知道ImageIO.framework能够做到这一点,甚至可以处理不同类型的文件。 - Grzegorz Adam Hankiewicz
NYXProgressiveImageView 不会加载渐进式 JPEG 文件的低质量部分。只有当全部下载完成后,它才会完整地显示图像。 - nickcheng
这是基线版本,不像Facebook应用程序那样是渐进式的。 - keywind

1
现在有一个基于libjpeg-turbo的小型开源库,可以轻松解码和显示渐进式JPEG图像:
let imageView = CCBufferedImageView(frame: ...)
if let url = NSURL(string: "http://example.com/yolo.jpg") {
    imageView.load(url)
}

看见 https://github.com/contentful-labs/Concorde


0

你尝试过在 didReceiveData 被调用时部分渲染 UIImage 吗?就像这样...

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    //TODO: add some error handling in case the image could not be created
    UIImage *img=[UIImage imageWithData:data];
    if (img) {
        self.imageView.image=img;
    }
}

那并不像我预期的那样糟糕,所以我想暂时就这样吧。不过,图片显示尚未下载的区域的方式有点丑陋,并且似乎在性能方面比逐步解压缩原始libjpeg图像要差得多,因为需要完全重新计算图像。 - Grzegorz Adam Hankiewicz
另一种方法(我猜更好的一种)是使用类似于libjpeg这样的库(如果在iOS上可用)。 - versatilemind

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