ios - 在 UIImageView 中显示交错(逐行)图像

标签 ios iphone objective-c cocoa-touch uiimageview

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

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

这最好显示在 VIDEO HERE

我关注了这个 SO 问题:

How do I display a progressive JPEG in an UIImageView while it is being downloaded?

但我得到的只是一个 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);
    }
}

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

DEMO PROJECT HERE

最佳答案

这是我一段时间以来一直感兴趣的话题:似乎没有办法使用 Apple 的 API 来做你想做的事,但如果你能在这方面投入时间,你可能会让它发挥作用。

首先,您需要一个 JPEG 解码库:libjpeg 或 libjpeg-turbo .然后,您需要将它集成到可以与 Objective-C 一起使用的东西中。有一个开源项目使用了这个库,PhotoScrollerNetwork ,它利用 turbo 库在下载时“即时”解码非常大的 jpeg,因此可以对它们进行平移和缩放(PhotoScroller 是一个执行平移和缩放的 Apple 项目,但它需要预先平铺的图像)。

虽然上述项目并不是您想要的,但您应该能够提升大部分 libjpeg-turbo 接口(interface)来解码渐进式图像并在接收到低质量图像时返回它们。看起来你的图像很大,否则几乎不需要渐进图像,所以你可能会发现上述使用项目的平移/缩放功能。

PhotoScrollerNetwork 的一些用户要求支持渐进式图像,但似乎很少有人在网络上普遍使用它们。

编辑:第二个想法:如果您的网站是您用来出售渐进式图像的(我假设是这样,因为通常很少能找到),您可以采取完全不同的策略。

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

关于ios - 在 UIImageView 中显示交错(逐行)图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20596050/

相关文章:

ios - 在 iOS 上每 n 秒执行一次连接检查

ios - 无法缩放 UIImageView

ios - 为什么有些库需要嵌入而有些不需要?

iphone - dequeueReusableCellWithIdentifier :identifier not picking up a loadNibNamed cell

iphone - 我怎样才能获得第二个mov播放时间

objective-c - Cocos2D - 自动设置 Sprite 移动速度

ios - 我应该在 presentationIndexForPageViewController : for my UIPageViewControllerDataSource? 中返回什么

ios - 在 Swift 中,当使用 dataTaskWithRequest 时,completionHandler 在请求超时时返回 nil NSURLResponse

ios - 执行同步操作

iphone - 如何通过 AudioServicesSetProperty 设置 kAudioServicesPropertyIsUISound?