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



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

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

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

你可以像这样从 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实用程序的源代码以供参考。

有一些

线程在堆栈溢出上为 iOS 编译libjpeg

希望这有帮助。

最新更新