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图像的示例,其中滤镜字节以粗体显示.
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
0 0 0 0
0
0 0 0 0
并且像素反转的图像.
0
1 1 1 1
0
1 1 1 1
0
1 1 1 1
0
1 1 1 1
很明显哪种压缩效果更好.
在提供的白色背景图像中,流经0x01
常被0x00
过滤字节中断,对可压缩性具有负面影响.在黑色背景图像中,没有这种效果.