在iOS上缩小图像的内存效率最高的方法是什么?

Dan*_*mov 22 memory-management core-graphics cgimage ios javax.imageio

在后台线程中,我的应用程序需要从磁盘读取图像,将它们缩小到屏幕大小(1024x768或2048x1536)并将它们保存回磁盘.原始图像主要来自相机胶卷,但其中一些可能具有较大的尺寸(例如3000x3000).

稍后,在不同的线程中,这些图像将经常缩小到500x500左右的不同大小并再次保存到磁盘.

这让我想知道:在iOS,性能和内存方面,最有效的方法是什么?我使用了两种不同的API:

两者都适合我,但我想知道他们在性能和内存使用方面是否有任何差异.如果有更好的选择,当然.

Bar*_*ski 7

虽然我不能肯定地说它会有所帮助,但我认为值得尝试将工作推向GPU.您可以通过渲染给定大小的纹理四边形,或使用GPUImage及其调整大小功能来自行完成.虽然它在旧设备上有一些纹理大小限制,但它应该比基于CPU的解决方案具有更好的性能

  • GPUImage方法非常耗费内存 (2认同)

not*_*173 5

使用libjpeg-turbo,您可以使用scale_num和的scale_denom字段jpeg_decompress_struct,它只会解码图像所需的块.它给了我250S解码+ 4S背景线程的缩放时间,3264x2448原始图像(从相机,存储器中的图像数据)到iPhone的显示分辨率.我想这对于大而且仍然不太好的图像来说是可以的.

(是的,这是内存效率.你可以逐行解码和存储图像)


Tom*_*mmy 3

如果两者中任何一个效率更高,那么它就是前者。

\n\n

当您创建一个CGImageSource顾名思义的 \xe2\x80\x94 时,您创建了某种不透明的东西,可以从中获取图像。在您的情况下,它将是对磁盘上事物的引用。当您要求 ImageIO 创建缩略图时,您明确地告诉它“输出这么多像素,需要做多少就做多少”。

\n\n

相反,如果你绘制到 aCGBitmapContext那么在某个时刻你会明确地将整个图像带入内存。

\n\n

因此,第二种方法肯定会在某个时刻将整个图像立即存储在内存中。相反,前者不一定(在实践中,毫无疑问,ImageIO 内部会进行某种关于最佳处理方式的猜测)。因此,在操作系统的所有可能实现中,要么前者更有优势,要么两者之间没有区别。

\n