当我生成每像素1位索引颜色的黑白png图像时,如果我选择使用黑色背景而不是白色,那么它似乎会在文件大小上产生显着差异。附加的图像应该具有完全相同的信息,并且都是由.NET 4的Bitmap.Save()函数创建的。
压缩后,为什么带有白色背景的图像会明显变大?
黑色背景:4.62KB Black background 4.62KB
白色背景:5.67KB White background: 5.67KB
答案 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
滤镜字节定期中断,对可压缩性产生负面影响。在黑色背景图像中,没有这种效果。