为什么iOS应用程序包中的PNG图像比在我的项目中大?

我正在更新iOS 6的Hungry Helga(iPhone和iPad版本),我的新应用程序包档案中的所有PNG文件都比我以前的版本大20%到40%。 当然,这是让我超过了50 MB的3G下载限制,所以我真的想弄清楚是怎么回事。

我目前在OSX 10.7.5上使用Xcode 4.5版本。 如果我记得正确的话,以前的版本是用Xcode 4.2构build的。 我尝试打开和closures构build设置中的PNG压缩,但对包中的图像大小没有影响。

举一个具体的例子,我最大的PNG图像是1.9 MB作为源资源。 旧应用程序包中为2.1 MB,新应用程序包中为2.5 MB。

苹果是否改变了PNG压缩器的工作方式,或者有可能是我错过了什么?

我不为苹果工作,也没有任何内幕消息 – 然而,我的确在推测,并有一些理论。 如果你使用terminal,你可以进入Xcode.app,在那里findpngcrush:

$ find。 -name pngcrush ./Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush

如果你然后运行:

./pngcrush -? 

你会发现一些有趣的花絮:

| 它是用LLVM 4.2.1 Compatible Apple Clang 4.0(tags / Apple / clang-420.0.12)编译的,并由Apple根据源代码进行了修改。

-iphone(为iPhone OS优化)

因为我也看到了一些大的png,比原来的更大(我之前把自己弄碎了!),我想看看Xcode是如何使用pngcrush的。 我使用了一个旧的UNIX技巧:

  • 将pngcrush移动到xpngcrush
  • 创build一个新的可执行shell文件,该文件使用相同的参数列表调用pngcrush
  • 将参数logging到/ tmp中的文本文件中

我发现苹果公司把pngcrush称为:

pngcrush -q -iphone oldFile newFile

从这里可以推断出pngrush的这个苹果特定function是专门为iOSdevise的。 我说裁缝,而不是暗恋。

苹果真的在乎,如果你的PNG是最小的文件,以节省最大的空间? 我认为,不是真的 – 这些设备有相当大的文件存储空间。 他们真的关心,如果你的应用程序下载真的很快? 再一次,我不会说真的,因为用户会假定时间与应用程序的大小有关,而且这是在开发人员的控制之下。

但是,苹果要追究苹果的发射速度。 从第一次点击到应用程序开始做什么的时候,人们会相信这是设备的所有速度(我们开发人员所知道的并不是严格意义上的)。 随着新的iPad3,一些启动图像现在真的很大,所以可以做什么来尽可能快地加载它们?

我不知道这个问题的答案,但我可以想象,苹果解压原始图像,然后重新压缩它的设置,尽可能快地加载到设备中。

PS:

1)我只是禁用了粉碎选项,并观察Xcode 4.5复制我的PNG文件没有修改。

2)为了减小你的应用程序的大小,你有没有尝试过使用高质量的JPEG设置 – 甚至1? 这样的图像看起来非常好,而且要小得多。 我应用程序中的几乎所有图像都是JPEG。 您可以试用“预览”进行转换。

编辑:它发生在我身上可能有一个优雅的解决scheme。 也就是说,对于真正重要的图像 – 要尽可能快地出现的图像 – 然后使用带“-iphone”标志的pngcrush。 对于其他人,使用更多的标准pngcrush选项。

一种方法是创build一个新的图像目录,然后编写一个shell文件,用一个真正的破解程序或“-iphone”标记预处理每个png,将输出放在原始图像文件夹中(Xcode可以获取它们)。 然后closures自动“粉碎PNG文件”选项。

编辑2:我在bugreporter.apple.com上input了一个bug,并在Xcode listserv上发布 – 如果你对这个书签有兴趣,那么在更新时会回来。

编辑3:有人给了我一个链接,更详细地解释了如何以及为什么苹果的“-iphone”选项ImageOptim

编辑4:苹果回应了我的错误报告,确认他们修改图像,以便更容易处理的iOS,这可能使他们更大,意图。

使用David H的脚本,我发现Xcode也将命令行参数“-f 0”传递给pngcrush。 该手册页指出,“-f 0”将在压缩之前禁用任何IDAT过滤,从而导致更大的PNG文件。 从上面的1.9 MB示例文件testing证实:

pngcrush -iphone in.png out.png给出了2.1 MB的结果,我正在寻找

pngcrush -iphone -f 0 in.png out.png会产生不需要的2.5 MB结果

现在的问题是:苹果为什么改变这个? 如果我解决了这个问题,会不会以某种方式破坏图片加载? 如果没有,在Xcode中是否有这样的设置,或者我将不得不使用脚本来过滤掉“-f 0”参数?

Xcode 5现在在图像压缩方面发生了变化。 最好的和压缩的方式是使用资产目录。

如果即使使用Xcode 5并且资产目录对于您的应用程序效果不佳,请使用pngcrush工具检查其他相关的post PNG优化问题,以获得更多答案