为什么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优化问题,以获得更多答案