我不确定 LZW 编码的细节,但我相信它通过构建公共位序列字典(每次出现时都必须相同)来压缩数据。这意味着线条图等压缩得非常好,因为它们包含许多“纯”颜色区域(即相同的像素颜色重复相同,连续多次。)如果您有一个 100 个白色像素的区域,您可以通过说它是“连续100 个相同的白色像素”来压缩它。
“自然图像”,例如数码相机产生的图像,不包含纯色区域。一张蓝色墙壁的照片实际上会包含许多不同深浅的蓝色——相机噪点至少会使每个像素与其相邻像素略有不同。LZW 将无法找到许多重复序列,因此无法对数据进行太多压缩。
JPEG 比 GIF 实现了更小的文件大小,因为它不害怕从图片中丢失一点信息——它是有损的。诀窍在于,JPG 的设计目的是只丢失人类无论如何都不擅长看到的信息。(见注 1。)我们擅长在图片的“平滑”区域看到伪影,但不擅长在图像中的锐利过渡附近看到伪影。
它也是一种完全不同的压缩算法,基于将图像编码为二维频域表示(数字信号处理类型的东西),而不是试图找到重复的比特子序列。
注 1:JPEG 是一种“感知”压缩方法。它发挥了人类视觉的优势和劣势——“平滑”颜色区域的小错误很容易看到,但图像“繁忙”区域的小错误很容易在细节中被遗漏。
MP3 音频的工作原理相同。它丢弃了我们听不到的信息;例如,如果有一个响亮的声音,然后是一个安静的声音,我们通常听不到安静的声音 - 我们的耳朵已经被大声的声音淹没了,并且不会听到它之后的安静声音。MP3 编码抛弃了安静的声音,专注于正确处理响亮的声音。
笔记2:
我刚刚意识到我实际上并没有解决PNG。
PNG 比 GIF 实现了更好的压缩,因为它在无损压缩之前应用了预过滤步骤(即DEFLATE
,大致相当于 LZW。)请参阅Wikipedia 对 PNG 过滤的解释。
这个想法是相邻像素可能彼此略有不同(由于噪声),但它们的值大致相同。
假设我们有数据:
132 133 134 135 136 137 138
LZW 看着这个并说“这些值都是不同的;我无法压缩它。”
PNG根据值之间的差异来看待这一点:
132 +1 +1 +1 +1 +1 +1 +1
即第一个数据元素为132
,后面的元素相加得到1
。这种表示用 LZW 压缩得很好。