什么时候在iPhone开发中使用PNG或JPG?


98

我有一个应用程序,可以在幻灯片中显示一堆图像。这些图像将成为捆绑软件的一部分,因此随应用程序一起分发。

所有图像均为照片或摄影等。

我已经读过,首选使用PNG作为图像格式,但是看到JPG版本会更小,我宁愿使用它。

有什么指南可以使用哪种格式?


我想补充一下,如果有任何不同,原始图像已经全部为JPG格式。
小牛

Answers:


140

PNG像素完美(无损),并且只需要很少的额外CPU能量即可显示。但是,大型PNG可能需要比更多压缩图像格式更长的时间才能从存储中读取数据,因此显示速度较慢。

JPG的存储量较小,但有损(其量取决于压缩级别),要显示它们,需要更复杂的解码算法。但是典型的压缩和图像质量通常对于照片来说已经足够了。

使用JPG来处理照片和较大的图片,使用PNG来处理较小的图片和/或设计为“像素完美”的显示(例如,小图标)或作为合成的透明叠加层的一部分等。


1
我还没有看到JPEG,PNG和iPNG解码性能方面的任何数据。有时,由于减少了I / O,因此压缩程度更高的格式会更好;我不确定iPhone的闪存驱动器有多快。而且我绝对不会说PNG减压需要“很少”的能量;Other.artwork文件似乎是原始位图数据,大概是因为PNG解压缩的CPU /内存开销对于常用的UI组件而言过多。
tc。

2
在我当前的项目中,由于透明度要求,我们有非常大的png文件。磁盘IO大大超过了解码jpeg所花费的时间。请记住,仅使用其他算法也压缩PNG。
约翰

2
我想为那些试图最大化图像性能的人添加一个补充技巧。如果您具有良好压缩的JPG,则可以提前将原始JPG数据加载到NSData对象中(可能在数组或字典中),并在需要显示时使用UIImage:imageFromData来构建JPG。JPG数据可以比位图图像数据小10到100倍,但是它允许您尽早取出(相对较慢)的IO部分。显然,要小心以这种方式缓存/预加载多少数据。
奈杰尔·弗拉克

2
我发现了一些有关压缩时间的数据:cocoanetics.com/2012/09/… 看来,使用png并不比jpg快;)
MaciejKozieł14年

20

Apple优化了iPhone应用程序包中包含的PNG图像。实际上,iPhone使用一种特殊的编码,其中颜色字节针对硬件进行了优化。在构建项目时,XCode会为您处理这种特殊的编码。因此,除了尺寸方面的考虑之外,您还会看到在iPhone上使用PNG的其他好处。因此,绝对建议对出现在界面中的任何图像(在表格视图,标签等中)使用PNG。

至于显示全屏图像(例如照片),您仍然可以从PNG中获得好处,因为它们无损,并且视觉质量应该比JPG更好,更不用说解码图像时的资源使用情况了。您可能需要降低JPG的质量,才能看到文件大小的真正好处,但是随后显示的不是最佳图像。

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


5
在我的基准测试中, Xcode优化实际上使文件变慢,可能是因为磁盘I / O而不是CPU是瓶颈。
Kornel 2012年

1
“ Apple优化了iPhone应用程序包中包含的PNG图像”-这是否意味着未对动态下载的PNG进行优化?
罗伯特

1
不,动态下载的PNG尚未优化。优化基本上只是将字节顺序从RGBA交换为BGRA,这是iPhone图形芯片内部使用的。此处的更多信息:graphicsoptimization.com/blog/?
尼克·洛克伍德

11

对于PNG,有一件重要的事情要考虑。如果您的Xcode版本中包含PNG,则会针对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业绩比较基准 在不同的质量水平,和PNG格式JPG格式的,有和没有破碎。

从他的结论:

如果您绝对需要Alpha通道或必须使用PNG,则建议在Web服务器上安装pngcrush工具,并使其处理所有PNG。在几乎所有其他情况下,高质量JPEG将较小的文件大小(即,更快的传输速度)与更快的压缩和渲染功能结合在一起。

事实证明,PNG非常适合用于UI元素的小图像,但不适用于任何全屏应用程序(例如目录或杂志)。在那里,您将希望根据原始材料在60%到80%之间选择压缩质量。

就全部显示而言,您将希望挂接到曾经从中绘制过一次的UIImage实例,因为这些实例中包含文件的缓存未压缩版本。如果您没有视觉上的停顿,就不会在屏幕上出现大图像,则必须提前对两张图像进行解压缩。但是请记住,这些将占用大量RAM,如果您使用过多RAM,则可能导致您的应用终止。NSCache是​​放置常用映像的好地方,因为这会在RAM不足时自动清除映像。

不幸的是,我们没有任何方法可以知道图像是否仍然需要解压缩。同样,图像可能在未通知我们此效果的情况下驱逐了未压缩的版本。在Apple的错误报告站点上,这可能是一个不错的Radar。但是,幸运的是,如果图像已经解压缩,则如上所示访问图像不会花费时间。因此,您不仅可以做到“及时”,而且可以“以防万一”。


确实,JPEGMini和ImageOptim使jpeg很小!
electronicix384128

7

只是以为我会分享一些减压性能数据...

我正在做一个360度查看器的原型制作-旋转木马,用户可以在其中旋转从不同角度拍摄的一系列照片,以给人以能够平滑旋转物体的印象。

我已经将图像数据加载到NSData的数组中,以使文件I / O脱离等式,但可以动态创建NSImage。以接近最大帧速率(〜25 fps)进行测试并在Instruments中观看,我看到该应用程序显然受CPU限制,并且CPU负载大约增加了10%,显示〜275 kb png和〜75 kb jpg。

我不能肯定地说,但我的猜测是CPU限制仅来自一般程序的执行以及内存中所有数据的移动,但是图像解压缩是在GPU上完成的。无论哪种方式,JPG与PNG的性能争论似乎都倾向于JPG,尤其是当考虑到较小的文件大小(因此,至少在链的某些部分中,内存中的对象的大小较小)时。

当然,每种情况都不尽相同,测试无可替代...


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

5

使用jpegs和png时,我发现动画性能存在巨大差异。例如,将三个屏幕大小的jpeg并排放置在UIScrollView中,然后在iPhone4上水平滚动会导致滞后和完全令人不快的抖动动画。使用相同尺寸的非透明png时,滚动是平滑的。即使图像很大,我也不会使用jpeg。


1

我认为,如果要使用透明,则只能选择PNG。但是,如果您的背景已经不透明,则可以使用JPG。那是我唯一能看到的区别


3
这没有解决JPG vs PNG的任何性能问题。
daveMac

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.