【问题标题】:How can I load a section of an image in iOS, without loading the entire contents in to memory?如何在 iOS 中加载图像的一部分,而不将整个内容加载到内存中?
【发布时间】:2012-12-12 23:50:35
【问题描述】:

我正在使用具有不同单元格大小的表格视图来保存图像。由于它的大小不同,我有时使用 ALAsset fullScreenImage 来获得比缓存缩略图更高的分辨率。但是,由于它是从磁盘加载一个相当大的图像,因此存在明显的延迟(而缩略图几乎是瞬间加载的)。

有没有办法从磁盘加载特定分辨率的图像或图像的一部分(例如左半部分或右半部分)?我认为整个内容都需要加载到内存中,因为它通常是压缩的 jpeg,但我想我会问一下,以防有什么我没有考虑过。

【问题讨论】:

    标签: ios ios6 alassetslibrary alasset


    【解决方案1】:

    这对于某些图像格式是可能的,但对于 jpeg 或 png 文件则不然。您还必须自己编写它,因为在 iOS 中没有用于此的 API,但是,如果您唯一关心的是短暂的延迟,您可以将加载包装到异步 GCD 队列中并在高分辨率图像时使用缩略图正在加载。

    【讨论】:

    • 是的,我已经完成了异步队列。我知道解压缩 jpeg 它通常需要整个东西,但似乎我已经看到了一种以某种方式分解它的方法。
    • 稍后在本页查看我的回答。
    • 我想按原样加载原始图像,并缩放给定的宽度和高度。无需在内存中获取原始图像。
    【解决方案2】:

    您可以像这样从 ALAssetsLibrary 读取原始 jpeg 数据:

    ALAssetRepresentation *rep = [self defaultRepresentation];
    uint8_t *buffer = (uint8_t *) malloc(rep.size);
    NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil];
    

    然后您可以使用libjpeg 并仅解码您需要的矩形(四舍五入为 8 像素)。 请参阅jpegtran 实用程序的源代码以供参考。

    在stackoverflow上有一些关于为iOS编译libjpeg的线程。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 2013-03-25
      • 2020-06-11
      相关资源
      最近更新 更多