为什么当颜色反转时1bpp PNG图像文件大小会增加?

时间:2014-08-23 06:37:56

标签: image compression png

当我生成每像素1位索引颜色的黑白png图像时,如果我选择使用黑色背景而不是白色,那么它似乎会在文件大小上产生显着差异。附加的图像应该具有完全相同的信息,并且都是由.NET 4的Bitmap.Save()函数创建的。

压缩后,为什么带有白色背景的图像会明显变大?

黑色背景:4.62KB Black background 4.62KB

白色背景:5.67KB White background: 5.67KB

1 个答案:

答案 0 :(得分:5)

答案可能是令人惊讶的,但很简单,并且在于PNG格式本身。

如前所述,PNG对每一行应用过滤器。这有助于压缩在一条线内或相邻线之间具有图案的图像。在这种情况下,图像几乎是单色,只有几个点,所以不使用过滤器会产生最佳结果。

每个图像行的filter byte is stored as the first byte。这是关键。

  

过滤器步骤本身会产生与传入序列大小相同的字节序列,但在不同的表示形式中,前面是过滤器类型字节。 [...]过滤器类型字节不被视为图像数据的一部分,但它包含在发送到压缩步骤的数据流中。

如果未使用过滤器,则过滤器字节为0x00。黑色1位4x4图像的示例,滤波器字节用粗体表示。

<强> 0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

压缩机接收的与平坦序列相同的图像。

<强> 0 0 0 0 0 0 0 0 0 0 0 { {1}}的 0 0 0 0 0

像素反转的图像。

<强> 0 0 0 0 0 1 1 1 1 0 1 1 1 1 { {1}}的 0 1 1 1 1

显然哪种压缩更好。

在提供的白色背景图像中,0的流会被1 1 1 1滤镜字节定期中断,对可压缩性产生负面影响。在黑色背景图像中,没有这种效果。