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

Met*_*ion 4 compression png image

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

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

黑色背景:4.62KB 黑色背景4.62KB

白色背景:5.67KB 白色背景:5.67KB

小智 5

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

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

过滤器字节存储作为第一个字节的每个图像行的.这是关键.

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

如果没有使用过滤器,则过滤字节为0x00.黑色1位4x4图像的示例,其中滤镜字节以粗体显示.

00 0 0 0
00 0 0 0
00 0 0 0
00 0 0 0

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

00 0 0 000 0 0 000 0 0 000 0 0 0

并且像素反转的图像.

01 1 1 101 1 1 101 1 1 101 1 1 1

很明显哪种压缩效果更好.

在提供的白色背景图像中,流经0x01常被0x00过滤字节中断,对可压缩性具有负面影响.在黑色背景图像中,没有这种效果.