我有一个应用程序,会以幻灯片形式展示一堆图片。这些图片将成为应用程序的一部分,因此随应用程序一起分发。
所有的图片都是照片或摄影等。
我读过PNG格式的图片被视为首选,但是因为JPG版本文件更小,我宁愿使用它。
是否有任何指南可以在哪种情况下使用哪种格式?
PNG 格式图像完美还原像素(无损),而且展示时所需的额外 CPU 能量非常少。然而,大型 PNG 图像从存储器中读取需要更长时间,因为比其他压缩格式的图像文件要大,这可能导致显示速度变慢。
JPG 格式图像文件较小,但有损(损失程度取决于压缩级别),并且需要更复杂的解码算法进行显示。但是,通常的压缩和图像质量对于照片来说通常已经足够了。
对于照片或任何大型图像,请使用 JPG 格式;对于任何小型图像或者需要像素完美还原(例如小图标)或作为组合透明叠加层的一部分等情况,请使用 PNG 格式。
苹果优化了包含在您 iPhone 应用程序包中的 PNG 图像。实际上,iPhone 使用一种特殊的编码方式,其中颜色字节针对硬件进行了优化。当您构建项目时,XCode 会为您处理此特殊编码。因此,在 iPhone 上使用 PNG 的其他好处不仅仅是考虑它们的大小。因此,强烈建议在界面中显示的任何图像(在表视图、标签等中)都使用 PNG。
至于显示全屏幕图像(例如照片),您可能仍然可以从 PNG 中受益,因为它们是非损耗性的,并且视觉质量应该比 JPG 好,更不用说解码图像时的资源使用了。您可能需要降低 JPG 的质量以获得文件大小的真正优势,但那样您会显示非最佳图像。
文件大小当然是一个因素,但在选择图像格式时还有其他考虑因素。
在使用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/
Cocoanetics的博客发布了一篇关于iOS性能基准测试的文章,涉及JPG图像在各种质量水平下以及PNG格式,在压缩和未压缩情况下的表现。
从文章结论来看:
如果你绝对需要alpha通道或者必须使用PNG格式,那么建议在服务器上安装pngcrush工具,处理所有的PNG格式。在几乎所有其他情况下,高质量的JPEG图像在文件大小(即传输速度)和更快的压缩和渲染方面表现更好。
PNG格式适用于用于UI元素的小图像,但不适合用于类似目录或杂志的全屏应用程序。在这种情况下,您需要根据源材料选择60%到80%之间的压缩质量。
为了确保图片正常显示,您需要保留UIImage实例,因为这些实例里面有一个未压缩的版本。当您没有可视化大型图像时,您需要提前强制解压缩一些图片。但请注意,这将占用大量RAM,如果您过度使用可能会导致应用程序被终止。NSCache是一个很好的放置经常使用的图像的地方,因为它可以自动在RAM不足时清除缓存。
不幸的是,我们无法知道图像是否仍需要解压缩。此外,图像可能会从缓存中清除未压缩版本而没有告知我们这一情况。这可能是一个值得在Apple的错误报告网站上提出的Radar。但是,如果图像已经被解压缩,则像上面所示访问图像不需要时间。因此,您可以“及时”和“防患于未然”。
我想分享一些关于解压性能数据的信息...
我正在开发一个360度浏览器 - 一个旋转木马,用户可以通过旋转照片来获得不同角度的视角,以平滑旋转对象的效果。
我已经将图像数据加载到NSData的数组中,以消除文件IO影响,但是需要实时生成NSImage。在接近最大帧率(约25fps)下测试并观察Instruments工具,我发现该应用程序明显受到CPU限制,针对大小分别为~275kb的png和~75kb的jpg格式的图片,CPU负载大约增加了10%。
虽然无法确定,但我猜测CPU限制只是由于一般程序执行和内存中所有数据的移动,而图像解压缩是由GPU完成的。无论如何,在JPG与PNG性能之间的争议上,我们可以看出JPG更具优势,特别是考虑到较小的文件大小(因此至少在某些链的部分中占用的内存对象也较小)。
当然,每种情况都不同,测试才是唯一的衡量标准...
我发现在动画性能方面使用jpeg和png存在巨大差异。例如,在UIScrollView中并排放置三个屏幕大小的jpeg图像,并在iPhone4上水平滚动,结果会出现卡顿和非常不愉快的抖动动画。而使用相同尺寸的非透明png图像进行滚动时,则会非常流畅。因此,即使图像很大,我也从不使用jpeg。
我认为如果你想使用透明度,除了PNG之外别无选择。但是,如果你的背景已经不透明,那么你可以使用JPG。这是我能看到的唯一区别。