我从相机胶卷中抓取一张图像,然后使用它一段时间,并将其以 PNG 格式保存到 iPhone 的磁盘上。我遇到了奇怪的崩溃,可能是由于内存不足。

如果我将其保存为 PNG 或 JPG(假设我选择注释来降低 JPG 情况下的质量),会有什么不同吗?具体来说:

  • 如果我将 UIImage 保存为 PNG 格式,则在从磁盘重新加载 UIImage 后,它会使用更多的内存吗?
  • 保存为 PNG 的行为是否可能在保存过程中暂时占用更多内存?

我一直假设 UIImage 是格式中立的表示形式,这应该不重要,但我认为我应该验证一下。

有帮助吗?

解决方案

我在商店中有一个应用程序,需要在编辑图像时保存图像的中间版本。在原始版本中,我使用PNG格式进行保存,以避免多次加载和保存JPEG造成的质量损失。

在 2.2 软件版本中的某个时候,Apple 对 PNG 写入代码进行了更改,导致从某些图像中保存 PNG 数据需要花费数倍的时间。我最终不得不更改为以 JPEG 格式保存,因为我的应用程序在退出时尝试保存图像时超时。

此外,您还会遇到问题,因为以 PNG 格式保存不会保留 UIImage 中的“方向”信息,因此使用内置相机以纵向方向拍摄的照片在保存并重新加载后会出现旋转。

其他提示


我遇到了奇怪的崩溃,可能是由于内存不足


然后 停止你现在正在做的事情 首先弄清楚这是否真的是坠机的原因。否则,您很有可能在这里追寻错误的问题,修复不存在的内存问题,而忽略崩溃的真正原因。如果你想修复崩溃, 首先找出导致崩溃的原因. 。跟踪“可能”的问题只会浪费时间和精力。

这取决于您正在处理的图像类型。如果您处理的是摄影图像,JPEG 几乎总是比 PNG 小,并且不会出现肉眼可见的明显细节损失。

相反,如果您正在处理高度非摄影图像,例如 GUI 元素或具有大块纯色的图像,则 PNG 和 JPEG 在大小上相当,但 PNG 将无损保存,而 JPEG 将有损保存并具有非常明显的文物。如果你有一个 真的 简单图像(例如,非常大的恒定颜色块),那么 PNG 很可能比 JPEG 小得多,并且同样不会有任何压缩伪影。

将图像另存为 PNG 或 JPEG 的操作不应占用太多临时内存。当图像位于内存中时,它通常以未压缩的形式存储在内存中,以便可以非常快速地将其绘制到屏幕上,而不是每次要渲染它时都必须解压缩。与未压缩图像的大小相比,压缩图像所需的额外临时存储量非常小。如果您可以将未压缩的图像放入内存中,则不必担心压缩时使用的内存。

当然,一旦将图像写入非易失性存储中的文件系统并释放内存中的图像,压缩图像有多大就不再重要了,因为它不再占用主内存。压缩图像的大小仅影响它使用的闪存存储量,这可能是一个问题,但它不会影响您的应用程序内存不足的可能性。

您的崩溃可能是由于 UIImagePickerController 中已知的内存泄漏造成的。

这应该可以帮助你解决这个问题。

我没有任何硬数据,但我认为 PNG 更可取,因为 Apple 似乎在 iPhone 操作系统中几乎到处都使用 PNG。

但是,如果您已经设置了用于写入 PNG 的代码,那么将其更改为写入 JPEG 应该不会太难,不是吗?只需尝试这两种方法,看看哪种效果更好。

尽可能使用 PNG。作为编译的一部分,XCode 通过实用程序 (pngcrush) 运行所有 PNG 文件以压缩和优化它们。

  1. 如果我将其保存为PNG,则在我将其从磁盘中重新加载后,uiimage会使用更多内存?=> 不,如果您从具有相同分辨率和相同通道数的 2 个图像导入,则内存大小相同。(如RGBA)
  2. 保存为 PNG 的行为是否可能在保存过程中暂时占用更多内存?=> 不,它只会影响你的磁盘内存。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top