在iPhone开发中何时使用PNG或JPG?

101

我有一个应用程序,会以幻灯片形式展示一堆图片。这些图片将成为应用程序的一部分,因此随应用程序一起分发。

所有的图片都是照片或摄影等。

我读过PNG格式的图片被视为首选,但是因为JPG版本文件更小,我宁愿使用它。

是否有任何指南可以在哪种情况下使用哪种格式?


我想补充一下,原始图像已经全部是JPG格式,如果这有任何区别的话。 - James
8个回答

141

PNG 格式图像完美还原像素(无损),而且展示时所需的额外 CPU 能量非常少。然而,大型 PNG 图像从存储器中读取需要更长时间,因为比其他压缩格式的图像文件要大,这可能导致显示速度变慢。

JPG 格式图像文件较小,但有损(损失程度取决于压缩级别),并且需要更复杂的解码算法进行显示。但是,通常的压缩和图像质量对于照片来说通常已经足够了。

对于照片或任何大型图像,请使用 JPG 格式;对于任何小型图像或者需要像素完美还原(例如小图标)或作为组合透明叠加层的一部分等情况,请使用 PNG 格式。


1
我还没有看到有关JPEG vs PNG vs iPNG解码性能的任何数据。有时,由于减少了所需的输入/输出,更压缩的格式可能更好;我不确定iPhone的闪存驱动器有多快。而且我绝对不会说PNG解压缩需要“非常少”的能量;Other.artwork文件似乎是原始位图数据,这可能是因为PNG解压缩的CPU/内存开销对于常用的UI组件来说太大了。 - tc.
2
在我的当前项目中,由于需要透明度,我们有非常大的PNG文件。磁盘IO远远超过解码JPEG所花费的时间。请记住,PNG也是经过压缩的,只是使用了不同的算法。 - John
2
我想为那些试图最大化图像性能的人添加一个补充提示。如果您有压缩良好的JPG文件,可以预先将原始JPG数据加载到NSData对象中(可能是数组或字典),并在需要显示时使用UIImage:imageFromData构建JPG。 JPG数据可以比位图图像数据小10-100倍,但它允许您尽早处理(相对较慢的)IO部分。显然要注意缓存/预加载的数据量。 - Nigel Flack
2
我找到了一些关于比较时间的数据:http://www.cocoanetics.com/2012/09/iphone-5-image-decompression-benchmarked/ 看起来,使用png并不比jpg更快 ;) - Maciej Kozieł

20

苹果优化了包含在您 iPhone 应用程序包中的 PNG 图像。实际上,iPhone 使用一种特殊的编码方式,其中颜色字节针对硬件进行了优化。当您构建项目时,XCode 会为您处理此特殊编码。因此,在 iPhone 上使用 PNG 的其他好处不仅仅是考虑它们的大小。因此,强烈建议在界面中显示的任何图像(在表视图、标签等中)都使用 PNG。

至于显示全屏幕图像(例如照片),您可能仍然可以从 PNG 中受益,因为它们是非损耗性的,并且视觉质量应该比 JPG 好,更不用说解码图像时的资源使用了。您可能需要降低 JPG 的质量以获得文件大小的真正优势,但那样您会显示非最佳图像。

文件大小当然是一个因素,但在选择图像格式时还有其他考虑因素。


5
在我的基准测试中,Xcode 优化实际上使文件变得更慢了,可能是因为磁盘 I/O 而不是 CPU 是瓶颈。 - Kornel
1
"苹果优化了包含在您的iPhone应用程序包中的PNG图像" - 这是否意味着动态下载的PNG图像没有被优化? - Robert
1
不,动态下载的PNG文件并没有被优化。优化基本上只是将字节顺序从RGBA交换为BGRA,这是iPhone图形芯片在内部使用的格式。更多信息请参见:http://graphicsoptimization.com/blog/?p=259 - Nick Lockwood

11

在使用PNG图片时需要考虑一件重要的事情。如果将PNG图片包含在Xcode构建中,则会对iOS进行优化。这称为PNG压缩。如果在运行时下载PNG图片,则不会被压缩。压缩的PNG文件和100%质量的JPG文件大致相同。低质量的JPG文件比高质量的JPG效果更好。因此,从性能角度考虑,排列顺序是:低质量JPG、高质量JPG、PNG压缩、PNG。

如果需要下载PNG图片,则应该在服务器上压缩PNG图片后再进行下载。

http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/


9

Cocoanetics的博客发布了一篇关于iOS性能基准测试的文章,涉及JPG图像在各种质量水平下以及PNG格式,在压缩和未压缩情况下的表现。

从文章结论来看:

如果你绝对需要alpha通道或者必须使用PNG格式,那么建议在服务器上安装pngcrush工具,处理所有的PNG格式。在几乎所有其他情况下,高质量的JPEG图像在文件大小(即传输速度)和更快的压缩和渲染方面表现更好。

PNG格式适用于用于UI元素的小图像,但不适合用于类似目录或杂志的全屏应用程序。在这种情况下,您需要根据源材料选择60%到80%之间的压缩质量。

为了确保图片正常显示,您需要保留UIImage实例,因为这些实例里面有一个未压缩的版本。当您没有可视化大型图像时,您需要提前强制解压缩一些图片。但请注意,这将占用大量RAM,如果您过度使用可能会导致应用程序被终止。NSCache是一个很好的放置经常使用的图像的地方,因为它可以自动在RAM不足时清除缓存。

不幸的是,我们无法知道图像是否仍需要解压缩。此外,图像可能会从缓存中清除未压缩版本而没有告知我们这一情况。这可能是一个值得在Apple的错误报告网站上提出的Radar。但是,如果图像已经被解压缩,则像上面所示访问图像不需要时间。因此,您可以“及时”和“防患于未然”。


没错,JPEGMini和ImageOptim可以让JPEG图片变得非常小! - electronix384128

7

我想分享一些关于解压性能数据的信息...

我正在开发一个360度浏览器 - 一个旋转木马,用户可以通过旋转照片来获得不同角度的视角,以平滑旋转对象的效果。

我已经将图像数据加载到NSData的数组中,以消除文件IO影响,但是需要实时生成NSImage。在接近最大帧率(约25fps)下测试并观察Instruments工具,我发现该应用程序明显受到CPU限制,针对大小分别为~275kb的png和~75kb的jpg格式的图片,CPU负载大约增加了10%。

虽然无法确定,但我猜测CPU限制只是由于一般程序执行和内存中所有数据的移动,而图像解压缩是由GPU完成的。无论如何,在JPG与PNG性能之间的争议上,我们可以看出JPG更具优势,特别是考虑到较小的文件大小(因此至少在某些链的部分中占用的内存对象也较小)。

当然,每种情况都不同,测试才是唯一的衡量标准...


2
GPU无法解压PNG文件。它使用的deflate格式不适合GPU启用的并行化类型。我猜JPG解码可以部分地由GPU加速,因为涉及到颜色空间转换。 - Kornel

5

我发现在动画性能方面使用jpeg和png存在巨大差异。例如,在UIScrollView中并排放置三个屏幕大小的jpeg图像,并在iPhone4上水平滚动,结果会出现卡顿和非常不愉快的抖动动画。而使用相同尺寸的非透明png图像进行滚动时,则会非常流畅。因此,即使图像很大,我也从不使用jpeg。


1

我认为如果你想使用透明度,除了PNG之外别无选择。但是,如果你的背景已经不透明,那么你可以使用JPG。这是我能看到的唯一区别。


4
这并未涉及JPG与PNG在性能方面的考虑。 - daveMac

1

'在适当的格式中生成艺术作品'一节下提到,对于照片请使用JPEG格式,详情请参见人机界面指南


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接