iOS和libpng上的PNG优化

我们在iOS应用程序中使用了一些旧代码,这些代码使用纹理图集和OpenGL渲染了简单的3D图像。 整个应用程序是使用最新的Swift版本编写的,但是使用OpenGL的部分是在Objective-C中编写的。 我不了解Objective-C,但这是有很好的理由-用这种语言编写的代码必须是我见过的可读性最低的代码。 幸运的是,一年多来我不需要接触该代码。

本周,企业提出了更新3D图像外观的要求。 我获得了PNG格式的新纹理地图集,我认为这将是在公园里散步-我仍然不需要触摸代码,我将一个地图集交换为另一个。

旧的纹理地图集文件是常规的PNG文件,但是由于某些未知原因(对我而言),它们具有怪异的扩展名。 在内部,文件是由libpng读取的,因此没有理由使用不同的扩展名。 我一直试图了解(可能的更改,如果可以使事情变得更容易)对我而言尚不清楚,因此我添加了具有常规PNG扩展名的新地图集文件,而不是将其重命名为旧版代码中使用的自定义文件。 这就是我遇到最初根本无法理解的问题的方式。 libpng无法读取抱怨CgBI chunk的新文件。

问题在于Xcode优化了默认情况下不属于Assets的所有PNG文件,并将它们转换为Apple的非标准PNG格式-CgBI(http://iphonedevwiki.net/index.php/CgBI_file_format)。 这种格式增加了libpng无法识别的额外标头。 这解释了为什么我之前的某人决定使用一些奇怪的自定义扩展名-以避免Xcode对文件运行优化。 这是解决问题的一种方法,但是还有另一种方法。 将任何PNG文件添加到Assets之外的项目后,“ Build Settings就会出现一组新的选项:

以上是默认状态。 为了使libpng可以正常工作,我必须将两个选项都设置为no 。 然后,它开始运行良好。


一些有趣的链接:

  • https://developer.apple.com/library/archive/qa/qa1681/_index.html
  • https://imageoptim.com/xcode.html

Interesting Posts