如何在iOS中加载图像的一部分,而不将整个内容加载到内存中?

时间:2012-12-12 23:50:35

标签: ios ios6 alassetslibrary alasset

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以从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时有一些线程。

希望这有帮助。