JPEG

图片压缩有多重要,可能很多人可能并没有一个直观上的认识,举个例子,一张800X800大小的普通图片,如果未经压缩,大概在1.7MB左右,这个体积如果存放文本文件的话足够保存一部92万字的鸿篇巨著《红楼梦》,现如今互联网上绝大部分图片都使用了JPEG压缩技术,也就是大家使用的jpg文件,通常JPEG文件相对于原始图像,能够得到1/8的压缩比,如此高的压缩率是如何做到的呢?
JPEG能够获得如此高的压缩比是因为使用了有损压缩技术,所谓有损压缩,就是把原始数据中不重要的部分去掉,以便可以用更小的体积保存,这个原理其实很常见,比如485194.200000000001这个数,如果我们用485194.2来保存,就是一种“有损”的保存方法,因为小数点后面的那个“0.000000000001”属于不重要的部分,所以可以被忽略掉。JPEG整个压缩过程基本上也是遵循这个步骤:

  1. 把数据分为“重要部分”和“不重要部分”
  2. 滤掉不重要的部分
  3. 保存

特点: 图片尺寸小,清晰度高
原理: 删除人眼不易察觉的元素

工序

  1. 色彩空间转换
    Y 亮度
    Cb 蓝色色度
    Cr 红色色度

  2. 色度缩减采样
    以2x2大小的像素为一个区块,计算每个区块中像素的平均值,并删除重复的信息。然后缩小图像,使得含有一个平均值的由四个像素组成的区块只占一个像素空间,亮度通道Y保持不变。此时,亮度为1,Cb和Cr都缩减为原来的1/4。
    这一步完成以后图像大小缩减为1/2。

  3. 离散余弦变换(DCT)
    以8x8大小的像素划分成区块,每个8x8的区域都用64张基础图像线性组合而成。
    DCT无法压缩或者缩小图像。

  4. 量化
    DCT变换后的图像除以一个频率举证,这个矩阵左上角为低频数据,人眼感知能力强,所以数值较小;反之右下角频率高,人眼感知能力弱,数值较大。

  5. 游程编码和哈夫曼编码
    由左上角之字形列出所有区块中的亮度和色度数值
    游程编码: 将列表中的0不列出来,只显示他有多少个
    哈夫曼编码:

jpeg图像重构

按以上工序反向操作。

jpeg的缺点

jpeg适合相机图像但不适合矢量图

H.264压缩算法(AVC)

在每一秒视频的30帧视频中提取两个I帧(iframe),然后对其他的29个帧使用预测或者双向预测,只对差异和运动进行编码,同时使用向前解码的帧作为参考。iframe的操作流程类似与jpeg算法。

入门视频

参考

https://thecodeway.com/blog/?p=69