【问题标题】:Can't find logic behind png file sizes找不到 png 文件大小背后的逻辑
【发布时间】:2011-11-24 18:55:21
【问题描述】:

我正在保存大量的小 png 文件以用于手机上的游戏,因此空间非常宝贵。

我正在尝试找出文件大小背后的逻辑,以便我可以最有效地保存内容,但即使在使用 pngcrush 之后,大小也完全不一致。

我保存了一张 1x1 的图片,需要 3kb。我有另一个 23x21 图像,只需要 2kb。我有两张大小几乎相同的图像,但一张需要 6kb,另一张需要 13kb。我将图像高度加倍并将一张图像复制到另一张图像的空白处并保存。合并后的图像只有 11kb!

为什么 1x1 图片比 23x21 图片大?为什么我可以将 13kb 的图像和 6kb 的图像合并得到 11kb 的图像?

这是我正在谈论的图像(第一张和第二张图像之间有一个 1x1 像素。很难看到,所以我只提供 URL:http://g42.org/temp/png/1x1.png):

example http://g42.org/temp/png/hat.png example http://g42.org/temp/png/1x1.png example http://g42.org/temp/png/helmet1.png example http://g42.org/temp/png/helmet2.png example http://g42.org/temp/png/helmet1_2.png

【问题讨论】:

  • 您是如何创建 .png 文件的? png 文件中是否有非图像元数据?
  • 我正在使用 Photoshop。我没有故意将元数据放入文件中,但我会认为使用 pngcrush 会从文件中删除它。
  • 1x1 图片?那不应该使用超过 300 个字节..
  • xxd 1x1.png > 1x1.xxd(十六进制转储)显示 1x1 图像中有一个 Photoshop ICC profile。如果您可以告诉 Photoshop 使用 sRGB 颜色配置文件,则可能会减小尺寸。 (至少这是 GIMP 用来创建 122 字节版本的内容)。
  • 好的,这解决了 1x1 的奥秘。我去分配配置文件并设置“不对该文档进行颜色管理”。该文件保存为 140 字节。我不确定这会产生什么影响。我尝试了其他图像。每张图像似乎可以节省大约 2 到 3kb。但是,它仍然没有解释组合图像的尺寸减小。新的组合图像为 7.7kb。原件是 5kb 和 11kb。即使没有颜色配置文件,组合图像仍然更小。

标签: compression png


【解决方案1】:

这不是压缩的东西,1x1 图像的问题在于它有元数据(似乎是由 Photoshop 添加的)、颜色配置文件(iCCP 块)。如果你查看二进制文件,它是字符串“iCCP”和“IDAT”之间的数据,它可以被删除,你会得到一个 69 字节的文件。 如果您重新打开并保存大多数图像查看器 (xnview) 的文件,或使用 pngcrush,您可以剥离该块。 :看这里:http://i.stack.imgur.com/fmOdA.png

关于头盔图像:除了其他信息块(imageReady 广告一些信息文本,如您所见),差异是由于不同的格式:两个头盔是调色板图像(每像素 8 位),单个头盔是带有 alpha 的 RGB(每像素 32 位)

【讨论】:

    【解决方案2】:

    PNG 压缩基于与 zlib 相同的算法,并且对正在压缩的数据高度敏感,因此您不会看到图像大小和文件大小之间的一致关系。在组合图像的情况下,它仍然大于较小的图像,并且考虑到图像两半的相似性,压缩器可能能够重用大量的霍夫曼树。我对算法的了解还不够,无法确定它是如何比另一半小的。

    只要您没有看到像 1x1 图像这样的怪异现象(您似乎已经在 cmets 中发现),我认为如果不广泛研究图像压缩,这将没有多大意义。

    【讨论】:

    • 拍摄一张 5kb 的图像并将其与 11kb 的图像组合起来会得到一个小于 16kb 的文件,这是有道理的。我试图弄清楚为什么您可以获取这两个文件并最终得到一个 7kb 的文件(小于 11kb 图像)。添加更多数据可以提高压缩效率真的合理吗?看起来组合图像中的颜色略有不同。这可能是其中的一部分。
    【解决方案3】:

    有一个很棒的工具叫做 pngcrush

    http://pmt.sourceforge.net/pngcrush/

    压缩为 PNG 是一项相当困难的任务 - 失去了尝试的假设和策略 - 我们是创建一个调色板,还是没有它我们会更好?

    PNGcrush 本质上暴力破解了 100 多种不同的压缩策略,同时修剪无用的标签和部分。

    【讨论】:

    • 正如我在原始问题中提到的,我已经在使用 pngcrush。 (实际上,我刚刚意识到我没有为最后一张组合图像完成它。我把它压碎了,它降到了 10,这更没有意义了!)
    【解决方案4】:

    PNG 有几种子格式:带或不带 alpha 的 24 位、8 位(包括 alpha)、灰度等,每个像素使用不同的字节数并具有不同的“可压缩性”。

    Plus PNG 支持多种压缩技巧(过滤器和 gzip 设置),这些技巧会影响图像数据的压缩效果。

    除此之外,PNG 还可以包含元数据,这些元数据有时可能非常大,例如一些嵌入的颜色配置文件。

    • ImageAlpha 将图像转换为最节省空间的 PNG8+alpha 变体。

    • ImageOptim 删除垃圾元数据并找到最佳压缩参数。

    结合使用这两者,您的图像可以缩小 30-50%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多