在UIImageView中显示隔行扫描(逐行扫描)图像

Mos*_*ano 10 iphone cocoa-touch objective-c uiimageview ios

我试图在下载时显示JPEG图像,使用部分数据,类似于许多网络浏览器或facebook应用程序.

有一个低质量的图像版本(只是数据的一部分),然后以完整的质量显示完整的图像.

这在视频中最佳显示

我跟着这个问题:

如何在下载时在UIImageView中显示渐进式JPEG?

但我得到的只是一个imageview,正在呈现数据保持,第一个没有低质量版本,没有真正的渐进式下载和渲染.

任何人都可以共享一个代码段或指向我可以找到更多关于如何在iOS应用程序中实现这些信息的信息?

尝试过此链接,例如显示JPEG信息,它将图像标识为渐进式

http://www.webpagetest.org/jpeginfo/jpeginfo.php?url=http://cetus.sakura.ne.jp/softlab/software/spibench/pic_22p.jpg

我使用了正确的代码序列

-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
    /// Append the data
    [_dataTemp appendData:data];

    /// Get the total bytes downloaded
    const NSUInteger totalSize = [_dataTemp length];
    /// Update the data source, we must pass ALL the data, not just the new bytes
    CGImageSourceUpdateData(_imageSource, (CFDataRef)_dataTemp, (totalSize == _expectedSize) ? true : false);

    /// We know the expected size of the image
    if (_fullHeight > 0 && _fullWidth > 0)
    {
            [_imageView setImage:[UIImage imageWithCGImage:image]];
            CGImageRelease(image);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是代码只显示加载完成后的图像,其他图像会在下载时显示,但只有从上到下,没有低质量的版本,然后逐渐添加细节,就像浏览器一样.

DEMO PROJECT HERE

Dav*_*d H 9

这是我有一段时间感兴趣的主题:似乎没有办法使用Apple的API做你想做的事情,但如果你能投入时间,你可能会让它发挥作用.

首先,您需要一个JPEG解码库:libjpeg或libjpeg-turbo.然后,您需要将其集成到可以与Objective-C一起使用的内容中.有使用这个库,一个开源项目PhotoScrollerNetwork,使用利用涡轮库"对飞",因为它们下载到解码非常大的JPEG文件,因此他们可以平移和缩放(PhotoScroller是苹果公司的项目,不摇摄和缩放,但它需要预先平铺的图像).

虽然上述项目并不完全符合您的要求,但您应该能够解除大部分libjpeg-turbo接口以解码渐进式图像并在接收到时返回低质量图像.看起来您的图像非常大,否则几乎不需要渐进式图像,因此您也可以找到上述使用项目的平移/缩放功能.

PhotoScrollerNetwork的一些用户请求支持渐进式图像,但似乎在网络上几乎没有使用它们.

编辑:第二个想法:如果它是你的网站,你将用于出售渐进式图像(我认为这是因为通常很少找到),你可以采取完全不同的机智.

在这种情况下,您将构建一个自己设计的二进制文件 - 一个在其中有4个图像的文件.前四个字节将提供其后的数据长度(并且每个后续图像将使用相同的4字节前缀).然后,在iOS端,随着下载开始,一旦你获得第一个图像的完整字节,你可以使用它们来构建一个小的低分辨率UIImage,并在接收下一个图像时显示它.当下一个完全到达时,您将使用较新的较高分辨率图像更新低分辨率图像.它可能你可以使用拉链容器,并在飞行减压 - 不是100%肯定.在任何情况下,以上都是您的问题的标准解决方案,并将提供与libjpeg几乎相同的性能,而工作少得多.