UIImage的jpg或png - 效率更高?

时间:2009-04-29 04:53:40

标签: iphone objective-c cocoa-touch uiimage

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

如果我将其保存为PNG或JPG(假设我选择注意降低JPG案例的质量)会有所不同吗?具体来说:

    如果我把它保存为PNG,那么当我将它从磁盘上重新加载后,
  • 是更多的内存然后由UIImage使用?
  • 保存为PNG的行为是否有可能在保存过程中暂时消耗更多内存?

我一直认为UIImage是一种格式中立的表示,它应该没关系,但我认为我应该验证。

7 个答案:

答案 0 :(得分:25)


  

我得到了奇怪的崩溃,可能是因为内存不足


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

答案 1 :(得分:10)

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

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

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

答案 2 :(得分:5)

这取决于您正在处理的图像类型。如果你正在处理摄影图像,那么JPEG几乎总是小于PNG,没有人眼可以看到的明显的细节损失。

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

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

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

答案 3 :(得分:1)

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

This should help you fix that.

答案 4 :(得分:0)

我没有任何硬数据,但我认为PNG更受欢迎,因为Apple似乎在iPhone OS中几乎无处不在使用PNG。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

  1. 是更多的内存,然后在重新加载之后由UIImage使用 磁盘如果我把它保存为PNG? =>不,如果您从具有相同分辨率和相同通道数的2个图像导入,则它的内存大小相同。 (例如RGBA)
  2. 保存为PNG的行为是否有可能在保存过程中瞬间消耗更多内存? =>不,它只影响您的磁盘内存。