PNG(Portable Network Graphics)格式是一种用于存储数字图像的无损压缩格式。无损压缩意味着压缩数据后可以完全还原原始数据,不会有任何信息的损失。
PNG压缩的基本流程
-
预处理(Filtering):为了提高压缩效率,PNG首先对图像数据进行预处理。这个预处理阶段称为过滤(filtering),其目的是减少相邻像素间的冗余,使得压缩更加有效。
-
压缩(Compression):经过预处理的数据将被送入压缩算法。PNG使用的压缩方法是基于DEFLATE算法,这是一种结合了LZ77算法和哈夫曼编码的压缩技术。
1.预处理(Filtering)
PNG提供了几种不同的过滤方法,每种方法都尝试以不同的方式减少图像数据中的冗余:
-
Filter 0(None):不进行任何过滤。
-
Filter 1(Sub):用当前像素减去其左边的像素。
-
Filter 2(Up):用当前像素减去其上面的像素。
-
Filter 3(Average):用当前像素减去其左边和上面像素的平均值。
-
Filter 4(Paeth):使用更复杂的预测算法来选择最佳的像素值进行差值。
这些过滤器通过计算连续像素之间的差异来工作,因为在图像中,相邻像素往往具有相似的颜色值,这种差异化处理有助于后续的DEFLATE压缩算法更有效地工作。
在PNG压缩中,过滤器(Filter)的作用是作用于图像数据的行级别,而不是直接作用于单独的颜色通道。每种过滤器都是用来处理一行像素的数据,并且这种处理涉及到该行中的所有颜色通道。这些过滤器主要是为了减少一行中像素之间的冗余,从而提高压缩效率。
为了更具体地解释这一点,我们可以通过一个简单的例子来展示如何使用其中一个过滤器(比如Sub)来处理一行图像数据。
例子:使用Sub过滤器处理一行图像数据
假设我们有以下一行RGB像素数据,每个像素由红(R)、绿(G)、蓝(B)三个通道组成,每个通道的值介于0到255之间:
-
像素1: (255, 0, 0) // 红色
-
像素2: (255, 128, 0) // 橙色
-
像素3: (255, 128, 128) // 浅橙色
使用Sub过滤器处理这行数据的过程如下:
- Sub过滤器(Filter 1):
- 对于每个像素,它使用当前像素的每个通道值减去前一个像素同通道的值(对于第一个像素,因为前面没有像素,所以它的值保持不变)。
- 计算过程:
-
像素1: (255, 0, 0) -> (255, 0, 0) // 第一个像素,保持不变
-
像素2: (255, 128, 0) -> (0, 128, 0) // 255-255=0, 128-0=128, 0-0=0
-
像素3: (255, 128, 128) -> (0, 0, 128) // 255-255=0, 128-128=0, 128-0=128
- 结果:
- 经过Sub过滤器处理后的行数据为:(255, 0, 0), (0, 128, 0), (0, 0, 128)
在这个例子中,你可以看到Sub过滤器通过减去前一个像素的相应颜色值来减少每个通道内的数据变化。这种差分编码有助于DEFLATE算法在后续步骤中更有效地压缩数据,因为连续的低值(如0)更容易被压缩。
这个例子展示了过滤器如何在一行像素中处理所有颜色通道的数据,以减少图像文件的整体大小,同时不牺牲图像质量。
2. DEFLATE压缩算法
DEFLATE算法是一种结合了LZ77算法和哈夫曼编码的压缩技术。这种算法被广泛用于多种文件格式的压缩,包括PNG、gzip和zip文件格式。
LZ77算法
- 工作原理:
- LZ77算法通过查找重复出现的字符串,并将它们替换为指向先前出现的相同字符串的指针来工作。这些指针通常表示为两个数字:一个是从当前位置向后退多远的偏移量,另一个是匹配长度。
- 示例:
- 假设我们有字符串 "abcabcabcabc"。在LZ77算法中,第二个及以后的 "abc" 可以被替换为指向第一个 "abc" 的指针。因此,这个字符串可能被编码为 "abc[3,9]",其中 "3" 是偏移量,"9" 是接下来9个字符与前3个字符相同。
哈夫曼编码
- 工作原理:
- 哈夫曼编码是一种基于字符出现频率进行编码的算法。出现频率高的字符用较短的码字表示,而出现频率低的字符用较长的码字表示。这种方法可以减少整体编码长度,从而达到压缩数据的目的。
- 示例:
- 如果在一个文档中,字符 'e' 出现的频率最高,那么我们可能会用二进制的 "10" 来表示 'e',而用 "110000" 来表示出现频率极低的字符 'x'。
3. DEFLATE在PNG中的应用
在PNG文件压缩中,DEFLATE算法先使用LZ77算法来减少数据中的重复内容,然后使用哈夫曼编码进一步减少数据的表示长度。通过这种方式,PNG文件在保持图像质量的同时实现了数据的压缩。
结合上述的过滤(Filtering)技术,PNG能够高效地减少图像文件的大小,而不损失任何图像质量。这使得PNG非常适合用于需要高质量图像且对文件大小敏感的应用,如网页设计和在线图形显示。