Dan*_*mov 22 memory-management core-graphics cgimage ios javax.imageio
在后台线程中,我的应用程序需要从磁盘读取图像,将它们缩小到屏幕大小(1024x768或2048x1536)并将它们保存回磁盘.原始图像主要来自相机胶卷,但其中一些可能具有较大的尺寸(例如3000x3000).
稍后,在不同的线程中,这些图像将经常缩小到500x500左右的不同大小并再次保存到磁盘.
这让我想知道:在iOS,性能和内存方面,最有效的方法是什么?我使用了两种不同的API:
CGImageSource和CGImageSourceCreateThumbnailAtIndex从ImageIO;CGBitmapContext并将结果保存到磁盘CGImageDestination.两者都适合我,但我想知道他们在性能和内存使用方面是否有任何差异.如果有更好的选择,当然.
使用libjpeg-turbo,您可以使用scale_num和的scale_denom字段jpeg_decompress_struct,它只会解码图像所需的块.它给了我250S解码+ 4S背景线程的缩放时间,3264x2448原始图像(从相机,存储器中的图像数据)到iPhone的显示分辨率.我想这对于大而且仍然不太好的图像来说是可以的.
(是的,这是内存效率.你可以逐行解码和存储图像)
如果两者中任何一个效率更高,那么它就是前者。
\n\n当您创建一个CGImageSource顾名思义的 \xe2\x80\x94 时,您创建了某种不透明的东西,可以从中获取图像。在您的情况下,它将是对磁盘上事物的引用。当您要求 ImageIO 创建缩略图时,您明确地告诉它“输出这么多像素,需要做多少就做多少”。
相反,如果你绘制到 aCGBitmapContext那么在某个时刻你会明确地将整个图像带入内存。
因此,第二种方法肯定会在某个时刻将整个图像立即存储在内存中。相反,前者不一定(在实践中,毫无疑问,ImageIO 内部会进行某种关于最佳处理方式的猜测)。因此,在操作系统的所有可能实现中,要么前者更有优势,要么两者之间没有区别。
\n| 归档时间: |
|
| 查看次数: |
5158 次 |
| 最近记录: |