【问题标题】:Resizing a UIImage on the iPhone with a small memory footprint在 iPhone 上调整 UIImage 的大小,内存占用很小
【发布时间】:2011-03-23 23:16:21
【问题描述】:

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

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

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

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

即使是 Apple 也建议立即调整用相机拍摄的照片的大小。但是(b/c 我相信他们知道这个主题非常复杂)他们没有提供任何关于如何管理它的指导。尤其是在图像数据返回的那一刻怎么做。

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

【问题讨论】:

  • 还有什么想法吗?我可能会把这个发给苹果。

标签: iphone memory-management uiimage uiimagepickercontroller


【解决方案1】:

我在这里没有 100% 好的答案,但您有几个选择。 iphone会让你进入编辑/裁剪等模式。我认为这就是Apple希望您使用的。对我们来说,这不是完全可以接受的。我们抓取图像数据,获取像素数据,释放原始图像。然后调整上半部分的大小,然后我们自己。我会发布一些代码,但不在工作。我可以在假期后的几天内...

【讨论】:

  • 根据您“获取”像素数据的方式,这可能会导致不必要的复制(一次进入UIImage,然后再次进入您的缓冲区)
【解决方案2】:

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

如果你想变得花哨,你可以改为 mmap 并设置 PROT_WRITE 标志,并且只受虚拟地址空间的限制

【讨论】:

  • 我尝试了这种方法,但无法节省内存。是否有特定的保留/释放模式以您可以共享的 UIImage 开头和结尾?
  • 我没有任何代码示例,因为我只是在我的越狱应用程序中使用了更简单的私有 API。上面的代码将为您提供一个调整大小的图像到您选择的缓冲区中。要从中创建 UIImage,请链接以下 API:CGDataProviderCreateWithDataCGImageCreate-[UIImage initWithCGImage:]。请务必遵循正确的内存管理模式并为您的CGDataProvider 指定正确的自定义释放回调。
【解决方案3】:

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

我使用了类似的调整大小来制作缩略图,以便应用程序下载更大的图片。我的图片可能没有您从图像选择器控制器中选择的图片那么大,但我发现结果相当不错。

希望它在某些方面有所帮助。

【讨论】:

    【解决方案4】:

    您的图像可能比我在我的应用程序中处理的要大,但您没有说明我们正在谈论的尺寸。我只能建议 Quartz 或您自己的调整大小过滤器逐行处理图片。

    【讨论】:

      【解决方案5】:

      这里有几个涵盖 UIImage 调整大小的 git 项目。我使用第二个,它就像一个魅力。它包含一个很好的示例项目,因此您可以准确了解如何使用它。我认为第一个也有样本,虽然我没有尝试使用它或仔细查看过。

      https://github.com/coryalder/UIImage_Resize

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

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

      【讨论】:

        猜你喜欢
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-15
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多