压缩

txt wav bmp这些格式虽然管用,而且现在还在用,但它们的简单性意味着效率不高。
压缩
上述吃豆人例子,图像是4像素*4像素
压缩
为了知道哪一行那里结束,图像要有元数据,写明尺寸等属性
每个像素的颜色是三原色的组合:红绿蓝
每个颜色用一个字节存,数字范围0-255
压缩
这个图像有16个像素,每个像素3个字节,总共占48个字节,但我们可以压缩到少于48个字节

游程编码

一种方法减少重复信息,最简单的方法是游程编码(run-length encoding)
适合经常出现相同值的文件。
比如吃豆人有7个连续的黄色像素
压缩
与其全记下来:黄色黄色黄色。。。,可以额外插入一个字节,代表有7个连续的黄色像素,然后删掉后面的字节
压缩
压缩
有时数据反而会变多,但这个案例里,我们大大减少了字节数,之前是48现在是24
压缩、这叫无损压缩,没有损失任何数据,解压缩后数据和压缩前完全一样。

霍夫曼树

我们需要一个字典,存储代码和数据间的对应关系。
举个例子,我们可以把图像看成一块块,而不是一个个像素,为了简单,我们把两个像素当成一块(占6个字节)
一共只有四块
压缩
有趣的是,这些块的出现频率不同
压缩
因为黄黄最常见,我们希望用最紧凑的形式去表示它,而黑黄和黑白,可以用更长的东西来表示,因为出现频率低
1950年,大卫霍夫曼发明可一种高效编码的方式叫霍夫曼树,算法如下
压缩
这里黑黄和白白频率最低
压缩
现在完成下一轮算法,重复这个算法,这次又3个可选,和上次一样,选频率最低两个,放在一起,并记录总频率
压缩
这次很简单,因为只有2个选择,把他组合成一颗树就完成了,它有一个很酷的属性,按频率排列。
现在有一颗树,你可能想,怎么把书变成字典。
压缩
压缩
酷的地方使它们绝不会冲突,因为每条树的路径是唯一的。意味着代码是无前缀的,没有代码是以另一个代码开头的。
现在开始压缩
压缩
这样从48位压缩到14位,同时字典也要保存下来,我们把字典加到14位前面,加上字典,图像是30字节比48好多 了
压缩
压缩
消除冗余和用更紧凑的表示方法,这两种方法通常会组合使用,几乎所有无损压缩格式都用了它们,比如GIF,PNG,PDF,ZIP
游程编程和字典编程都是无损压缩。

有损压缩

压缩音频

压缩时不会丢失信息,解压后,数据和之前完全一样。
有些文件,丢失一些数据也没什么关系,大多有损压缩技术,都用到了这点,实际细节比较复杂,所以讲下概念好了。
以声音为例,你的听力不是完美的,有些频率我们很擅长,有些我们更本听不见,比如超声波,举个例子,如果录音乐,超声波都可以舍弃,人类对人声比较敏感,应该尽量保持原样。
有损音频的压缩是用不同精度编码不同频段,你在电话里的声音和现实中不一样。
如果网速慢了,压缩算法会删掉更多数据,进一步降低质量,和没有压缩的音频格式相比,比如WAV或FLAC,压缩音频mp3能小10倍甚至更多。
这种删除人类无法感知的数据的方法,叫感知编码

压缩图像

最著名的压缩图像格式是JPEG,同人的听力一样,人的视觉系统也不完美,我们善于看到尖锐的对比,比如物体的边缘,但看不出颜色的细微变化,JPEG利用这点,把图像分解成8*8像素块,然后删掉大量高频率的空间数据。

压缩
小狗白框是一个8*8的像素,
压缩
很小的细节,但人眼看不出这些细节,因此可以删掉很多,用一个简单的块来代替。
压缩
这样看起来一样,但可能只占10%的原始数据。
压缩
视频只是一长串的图片,所以图片很多方面也适用于视频,但视频可以做一些小技巧,因为帧和帧之间有很多像素一样,这叫时间冗余,视频不用每一帧都存这些像素,可以只存变了的那一部分。这比存所有像素更有效率。
更高级的视频压缩格式会更进一步,找出帧与帧相似的补丁,然后用简单效果实现,比如移动和旋转,变亮和变暗。
例如摆手视频压缩器会识别到相似性,用一个或多个补丁代表我的手,然后帧至极爱你直接移动这些补丁。
MPEG-4是IC行家in标准,可以比原文件小20-200倍。
当压缩太严重会出错,没有足够的空间更新补丁内的像素,即使补丁错的,视频也会继续播放,如下图
压缩
压缩