我已经看过这个问题几十次,但从未回答。
如何调整UIImage(特别是从UIImagePickerController摄像头返回的UIImage)的大小。当我尝试任何方法时,我会得到20到40MB的内存峰值。它确实消失但我知道在某些硬件上这是完全不可接受的。
我尝试过使用以下操作的方法:drawInRect:,CGContextDrawImage(),imageWithCGImage:scale:orientation:
据我所知,生活在内存中的未压缩图像比磁盘上占用更多空间,但似乎最常见的UIImage调整大小操作涉及创建图像数据的副本。
即使Apple建议立即调整相机拍摄的照片尺寸。然而(b / c我相信他们知道这个话题非常复杂)他们没有就如何管理它提供任何指导。特别是在返回图像数据的时候该怎么做。
有没有人有一个平滑的方法来调整大型UIImage的大小,同时节省内存?我知道这是一项艰巨的任务。
答案 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或你自己的调整大小过滤器逐行完成图片。