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