10

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

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

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

我一直假设 UIImage 是一种格式中性的表示形式,这无关紧要,但我认为我应该验证一下。

4

7 回答 7

25

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


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

于 2009-04-29T17:18:01.710 回答
10

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

在 2.2 版软件发布前后的某个时候,Apple 对 PNG 编写代码进行了更改,使得从某些图像中保存 PNG 数据的时间要长很多倍。我最终不得不更改为以 JPEG 格式保存,因为我的应用程序在尝试在退出时保存图像时超时。

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

于 2009-04-29T19:19:51.700 回答
6

这取决于您要处理的图像类型。如果您处理的是摄影图像,JPEG 几乎总是比 PNG 小,不会像人眼所见的那样明显丢失细节。

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

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

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

于 2009-04-29T05:19:41.483 回答
1

您的崩溃可能来自 UIImagePickerController 中的已知内存泄漏。

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

于 2009-06-25T23:38:08.637 回答
0

我没有任何确凿的数据,但我认为 PNG 更可取,因为 Apple 似乎在 iPhone OS 中几乎所有地方都使用 PNG。

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

于 2009-04-29T05:06:11.907 回答
0

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

于 2009-04-29T18:51:07.697 回答
0
  1. 如果我将其保存为 PNG,则在我将其从磁盘重新加载后 UIImage 会使用更多内存吗?=> 不,如果您从 2 个具有相同分辨率和相同通道数的图像导入,则内存大小相同。(如RGBA)
  2. 是否有可能在保存过程中保存为 PNG 暂时占用更多内存?=> 不,它只会影响您的磁盘内存。
于 2013-09-20T05:01:30.680 回答