【问题标题】:How do I display a progressive JPEG in an UIImageView while it is being downloaded?下载时如何在 UIImageView 中显示渐进式 JPEG?
【发布时间】:2011-06-12 02:33:06
【问题描述】:

从网上下载图像并在 UIImageView 中显示它是相当容易的。但是,这要求图像在显示给用户之前完全下载,完全打败了渐进式 JPEG(和 PNG)图像。

如何在传输完成时渲染部分下载的图像?我会想象 SDK 有一些可以更新图像的回调函数,但我找不到这样的函数。使用当前的 iOS SDK 是否有可能?

【问题讨论】:

    标签: ios uiimageview png jpeg progressive-download


    【解决方案1】:

    您是否尝试在调用 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 那样逐步解压缩图像要差得多。跨度>
    • 另一种方法(我猜是更好的方法)是使用 libjpeg 之类的库(如果适用于 iOS)。
    【解决方案2】:

    我知道这篇文章大约有 1 年的时间,但以防万一有人在寻找它,有一个名为 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];
    

    另外,一个不错的选择是将您的图像保存为interlaced,以便它以低质量加载并随着下载而改进。如果图像不是隔行扫描的,则从上到下加载。

    【讨论】:

    • 谢谢,不知道ImageIO.framework 能够做到这一点,甚至对于不同的文件类型。
    • NYXProgressiveImageView 不加载渐进式 jpeg 文件的低质量部分。全部下载后,它只会完整显示图像。
    • 这是基线,不像 Facebook 应用那样渐进
    【解决方案3】:

    现在在 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

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 2012-06-30
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多