无法找到png文件大小背后的逻辑

时间:2011-09-25 20:21:36

标签: compression png

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

我正在试图找出文件大小背后的逻辑,这样我就可以最有效地保存事物,但即使使用pngcrush后,大小也完全不一致。

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

为什么1x1图像大于23x21图像?为什么我可以组合13kb图像和6kb图像并获得11kb图像?

以下是我正在谈论的图像(第1张和第2张图像之间有1x1像素。很难看到,所以我只提供网址: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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:1)

PNG压缩基于与zlib相同的算法,并且对正在压缩的数据高度敏感,因此您不会在图像大小和文件大小之间看到一致的关系。在组合图像的情况下,它仍然比较小的图像大,并且给定图像的两半的相似性,压缩器可能能够重用大量的霍夫曼树。我对这个算法知之甚少,不知道它最终会比另一半更小。

只要您没有看到像1x1图像这样的奇怪现象,您似乎在评论中已经想到了这一点,我认为如果不对图像压缩进行大量研究,这将是很有意义的。

答案 2 :(得分:0)

有一个很棒的实用工具叫做pngcrush

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

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

PNGcrush基本上强制执行100多种不同的压缩策略,同时修剪无用的标签和部分。

答案 3 :(得分:0)

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

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

除此之外,PNG可以包含元数据,有时可能会非常大,就像一些嵌入的颜色配置文件一样。

  • ImageAlpha将图片转换为空间效率最高的PNG8 + alpha版本。

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

通过这两者的组合,您的图像可以减少30-50%。