【问题标题】:Why are PNG images larger in the iOS app bundle than in my project?为什么 iOS 应用程序包中的 PNG 图像比我的项目中的大?
【发布时间】:2012-09-21 22:27:24
【问题描述】:

我正在为 iOS 6 更新 Hungry Helga(iPhone 和 iPad 版本),我的新 app bundle 存档中的所有 PNG 文件都比我之前的版本大 20% 到 40%。当然,这让我超过了 50 MB 的 3G 下载限制,所以我真的很想弄清楚发生了什么。

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

举个具体的例子,我最大的 PNG 图像是 1.9 MB 作为源资产。旧 app bundle 为 2.1 MB,新 app bundle 为 2.5 MB。

Apple 是否更改了 PNG 压缩器的工作方式,或者是否有我缺少的设置或其他什么?

【问题讨论】:

  • @lc。对于这个问题,这是一个相当可怕的解决方案

标签: ios xcode png


【解决方案1】:

我不为 Apple 工作,也没有任何内幕消息 - 但是,我确实四处闲逛并提出了一些理论。如果你使用终端,你可以 cd 进入 Xcode.app 并在那里找到 pngcrush:

$ 查找 . -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 操作系统进行优化)

因为我也看到捆绑包中的一些大 png 也比原始文件大得多(我之前自己压碎了!),所以我想看看 Xcode 如何使用 pngcrush。我使用了一个旧的 UNIX 技巧:

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

我发现苹果称 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。您可以尝试使用 Preview 来进行转换。

编辑:我想到可能有一个优雅的解决方案。也就是说,对于真正重要的图像——你希望尽快出现的图像——然后使用带有“-iphone”标志的 pngcrush。对于其他人,请使用更多标准的 pngcrush 选项。

这样做的一种方法是创建一个新的图像目录,并编写一个 shell 文件,该文件使用真正的破碎机或 tje '-iphone' 标志预处理每个 png,将输出放在原始图像文件夹中(其中 Xcode可以得到它们)。然后关闭自动“粉碎 PNG 文件”选项。

EDIT2:我在 bugreporter.apple.com 上输入了一个错误并发布在 Xcode listserv 上 - 如果您对此书签感兴趣,请在问题更新时回来。

EDIT3:有人给了我一个链接,更详细地解释了 Apple 的“-iphone”选项ImageOptim987654321@

EDIT4:Apple 回应了我的错误报告,确认他们修改了图像以便 iOS 更容易处理,这可能会使它们变大,这是有意的。

【讨论】:

  • 感谢您提供详细信息,但我认为您稍微误解了我的问题(并将标题更改为错误的问题)。我知道为什么 PNG 图像会在我的源资产和应用程序包之间改变大小。我的问题是它们在 Xcode 版本之间变得更大(在捆绑包中)。使用您在上面给我的信息,我用 pngcrush 压缩了我的示例文件,结果是 2.1 MB。所以我需要调查的两个问题是这个 2.5 MB 的文件来自哪里,为什么 Xcode 选项中的“压缩 PNG”似乎没有任何效果?
  • 您介意发布您替换 pngcrush 的 shell 脚本吗?我想看看我的 Xcode 是否发送了与您看到的相同的命令行参数。
  • 将旧的 pngcrush 移动到 xpngcrush。把它放在 pngcrush 中,然后 chmod +x pngcrush: #! /bin/ksh echo PNGCRUSH $@ >> /tmp/PNG.txt xpngcrush $@
  • 我在 Xcode 的 (7.x) 构建设置中不再看到 crush 选项。
【解决方案2】:

使用 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 结果

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

【讨论】:

  • 已接受。但是对于网站部署和应用程序部署,压缩可能会有所不同。因为应用程序具有额外的硬件利用功能,所以图像的存储尺寸和质量更高,适合高质量的视网膜显示器。所以让苹果为他们做伟大的事情,也为我们做伟大的事情。相信伟大+伟大=优秀。另一个相关问题stackoverflow.com/questions/7388324/… 也有一些肯定的答案。
【解决方案3】:

Xcode 5 现在对图像压缩进行了更改。最好的压缩方式是使用资产目录。

如果即使使用 Xcode 5 和资产目录对您的应用来说效果不佳,请查看其他相关帖子 PNG optimization issue using pngcrush tool 以获取更多答案可能会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多