在内存占用空间小的情况下调整iPhone上的UIImage大小

时间:2010-08-01 21:50:55

标签: iphone memory-management uiimage uiimagepickercontroller

我已经看过这个问题几十次,但从未回答。

如何调整UIImage(特别是从UIImagePickerController摄像头返回的UIImage)的大小。当我尝试任何方法时,我会得到20到40MB的内存峰值。它确实消失但我知道在某些硬件上这是完全不可接受的。

我尝试过使用以下操作的方法:drawInRect:,CGContextDrawImage(),imageWithCGImage:scale:orientation:

据我所知,生活在内存中的未压缩图像比磁盘上占用更多空间,但似乎最常见的UIImage调整大小操作涉及创建图像数据的副本。

即使Apple建议立即调整相机拍摄的照片尺寸。然而(b / c我相信他们知道这个话题非常复杂)他们没有就如何管理它提供任何指导。特别是在返回图像数据的时候该怎么做。

有没有人有一个平滑的方法来调整大型UIImage的大小,同时节省内存?我知道这是一项艰巨的任务。

5 个答案:

答案 0 :(得分:1)

使用少量内存的方法是使用CGBitmapContextCreate创建位图上下文并将UIImage绘制到其中。这将使用的唯一额外内存是malloc ed和一些小CGContext开销。

如果你想获得幻想,你可以设置mmap标志来PROT_WRITE,并且只受虚拟地址空间的限制

答案 1 :(得分:1)

您是否尝试使用以下博客post中描述的类别方法调整UIImage大小调整所使用的内存占用量。

我已经使用类似的大小调整来缩小应用程序下载更大图片的缩略图。我的照片可能不像你从你的图像选择器控制器那里那样大,但我发现它的性能非常好。

希望它在某种程度上有所帮助。

答案 2 :(得分:1)

以下是一些涉及UIImage调整大小的git项目。我使用第二个,它就像一个魅力。它包含一个很好的示例项目,因此您可以确切地了解如何使用它。我认为第一个也有一个样本,虽然我没有尝试使用它或仔细观察。

https://github.com/coryalder/UIImage_Resize

https://github.com/AliSoftware/UIImage-Resize

如果你真的担心内存占用,你可以做一些疯狂的事情 - 比如调整图像块并将它们拼接在内存中......但这可能只适用于非常大的图像。应该可以使用可用内存处理来自内置相机的照片。

答案 3 :(得分:0)

我这里没有100%的答案,但你有几个选择。 iPhone将允许您进入编辑/裁剪等模式。我想这就是Apple希望你使用的东西。对我们来说,这是不可接受的。我们抓取图像数据,获取像素数据,释放原始图像。然后调整上半部分,然后自己第二。我发布了一些代码,但我没有上班。我可以在假期后的几天内......

答案 4 :(得分:0)

你的图像可能比我在我的应用中处理的图像更大,但是你没有说我们正在谈论的尺寸。我只能建议使用Quartz或你自己的调整大小过滤器逐行完成图片。