Webp 原理

很多人用 webp 以减少体积,实际上损失了质量?

1. 分块(MacroBlocking)
将图片划分成多个宏块(macro blocks),典型的宏块由一个 16×16 的亮度像素(luma pixel)块和两个 8×8 的色度像素(chroma pixel)块组成。分块越小,预测越准,需要记录的信息也越多。一般来说,细节越丰富的地方,分块越细,即使用 4×4 分块预测。细节相对不丰富的地方使用 16×16 分块。(这一过程相当于 JPEG 编码中的色彩空间转换)

2. 帧内预测
WebP 有损压缩使用了帧内预测编码(相比 JEPG 对图像原值进行编码,WebP 编码的是预测值和原值的差值,这一技术也被用于 VP8 视频编码中的关键帧压缩。VP8 有四种常见的帧内预测模型。
  • H_PRED(horizontal prediction)
    像素块中每一行使用其左边一列(col L)的数据填充(如图3.2 Horizontal)
  • V_PRED (vertical prediction)
    像素块中每一列使用其上边一行(row A)的数据填充(如图3.2 Vertical)
  • DC_PRED (DC prediction)
    像素块中每个单元使用 row A 和 col L 的所有像素的平均值填充(如图3.2 Average)
  • TM_PRED (TrueMotion prediction)

3. DCT(离散余弦变换)
将预测部分的原图像数据减去预测出来的数据,得到差值矩阵,最后对差值进行 DCT。此步骤会生成一个频率系数矩阵,左上的系数幅度最大,右下最小。幅度值越小,频率越高。大部分图片信息都在左上区域。这一步的作用就是找出图片的高频和低频区域(?)。
4. 量化
人眼对高频部分不敏感,这一步会将高频部分舍去(?)。对上一步的频率系数表和量化表进行计算,将频率系数表和量化表按位相除,并四舍五入位整数。最终生成一个量化矩阵。
5. 算法编码
WebP使用 Arithmetic entropy encoding,该算法相比JPEG上使用的 Huffman encoding,在压缩表现上更出色。