游程编码 (Run-Length Encoding) : 消除冗余
为了让计算机分辨哪些字节是"长度"哪些字节是"颜色" 格式要一致, 所有的颜色数据前面都需要添加 颜色点的个数,
有时候, 文件反而会变大.
字典编码: 更紧凑的表示方法
使用一个字典 存储 “代码” 和 " 数据" 之间的对应关系.
可以把两个像素定成一个小块
接下来 需要将这个树变成字典
使用 0 和 1 标注每个分支.
树的路径是唯一的, 所以他们不会冲突
开始压缩
消除冗余 和 更紧凑的压缩 通常会结合使用, 它们都是无损压缩
有损压缩
丢掉一些 人们区分不出来的细节数据
例如, 我们无法听到超声波, 所有录音时 可以 扔掉 超声波;
对人声使用高精度编码, 因为我们对人声比较敏感;
对低音, 使用另外一种精度的编码方式, 人们对低音并不是很敏感, 只是感到震动.
这个也是电话里面和现实声音不一样的原因
如果网速变慢了, 网络会删除更多的数据! 进一步降低通话质量.
这种删除人们无法感知的数据的方法, 叫做 感知编码
图片压缩
这个是各种 有所压缩图像格式 的基础, 最著名的 JPEG
利用人们看不出颜色的细微变化这一点, 把图像分解成 8x8像素块
然后删除大量高频率空间数据
小细节太多了,但是人们看不出这些细节, 因此可以删除很多
我们依然可以认出来, 只是粗糙了一些.
图片压缩 同样也适用于视频
但是视频可以适用一下小技巧, 因为帧与帧之间很多像素都一样, 这个叫 时间冗余
视频里不用每一帧都存这些像素, 可以只存变了的部分.
更高级的视频压缩格式会更进一步:
找出帧和帧之间的相似的补丁, 然后用简单效果实现,比如移动和旋转, 变亮 和 变暗
举例:
在视频中摆手, 视频压缩器会识别到相似性, 然后用一个或多个补丁代表手, 然后帧之间直接移动这些补丁.
当压缩太严重时, 会出错, 没有足够的空间更新补丁内的像素
补丁错误会导致视频出现很多奇怪的画面: