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

Mer*_*rax 12 xcode png ios

我正在为iOS 6更新Hungry Helga(iPhone和iPad版本),我的新应用程序包存档中的所有PNG文件都比我以前的版本大20%到40%.当然,这让我超过了50 MB的3G下载限制所以我真的想知道发生了什么.

我目前在OSX 10.7.5上使用4.5版的Xcode.如果我没记错的话,以前的版本是用Xcode 4.2构建的.我尝试在构建设置中打开和关闭PNG压缩,但这对包中的图像大小没有影响.

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

Apple是否改变了PNG压缩器的工作方式,或者可能是我缺少的设置或其他东西?

Dav*_*d H 19

我不为Apple工作,也没有任何内部信息 - 但是,我确实在寻找并有一些理论.如果你使用终端,你可以进入Xcode.app并在那里找到pngcrush:

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

如果你然后运行:

./pngcrush -?
Run Code Online (Sandbox Code Playgroud)

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

| 它是使用LLVM 4.2.1兼容Apple Clang 4.0(标签/ Apple/clang-420.0.12)编译的,并由Apple修改,如源中所示.

-iphone(针对iPhone OS进行优化)

因为我也看到了一些大的pngs,它们在包中也比原来大得多(我以前压过自己!),我想看看Xcode如何使用pngcrush.我使用了一个旧的UNIX技巧:

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

我发现Apple称pngcrush为:

pngcrush -q -iphone oldFile newFile

可以从中推断,pngrush的这个Apple特定功能是专门为iOS定制图像而设计的.我说裁缝,不是暗恋.

Apple是否真的关心你的png是否是最小的文件,以节省最大的空间?我认为,不是真的 - 设备有相当大的文件存储空间.如果您的应用下载速度非常快,他们真的关心吗?同样,我认为不是真的,因为用户将假设时间与应用程序的大小相关,并且这是由开发人员控制的.

但是,用户要对Apple负责的是发布速度.从第一次点击到应用程序开始做某事时 - 人们会相信这是设备的全部速度(我们开发人员知道并非严格意义).使用新的iPad3,一些发布图像现在非常大,那么可以做些什么来尽可能快地加载它们呢?

我不知道这个问题的答案,但我可以想象Apple会对原始图像进行解压缩,然后使用尽可能快地将其加载到设备中的设置重新压缩它.

PS:

1)我刚刚禁用了crush选项,并观察Xcode 4.5复制我的png文件而不进行修改.

2)为了降低您的应用尺寸,您是否尝试过使用高质量设置的JPEG - 甚至1?这样的图像看起来非常好并且要小得多.实际上我的应用中的所有图像都是JPEG.您可以尝试预览来进行转换.

编辑:我想到可能有一个优雅的解决方案.也就是说,对于非常重要的图像 - 您希望尽可能快地显示图像 - 然后使用带有'-iphone'标志的pngcrush.对于其他人,请使用更多标准的pngcrush选项.

一种方法是创建一个新的图像目录,并编写一个shell文件,使用真正的破碎机或tje' -iphone'标志对每个png进行预处理,将输出放在原始图像文件夹中(Xcode可以在其中获取它们) ).然后关闭自动'Crush PNG Files'选项.

编辑2:我在bugreporter.apple.com上输入了一个错误并发布在Xcode listserv上 - 如果您对此书签感兴趣,请在更新后再回来.

EDIT3:有人给了我一个链接,更详细地解释了Apple的'-iphone'选项ImageOptim的方式和原因

编辑4:Apple回复了我的错误报告,确认他们修改了图像以便iOS更容易处理,这可能会使它们变得更大.


Mer*_*rax 0

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

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

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

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