全栈开发知识库

WebP

WebP是一种图片格式,它使用VP8关键帧编码,以有损方式压缩图像数据或WebP无损编码。

除了 WebP 的基本用例(即包含编码为 VP8 关键帧的单个图片的文件)之外,WebP 容器(即 WebP 的 RIFF 容器)还支持其他功能。WebP 容器提供 对以下各项的支持:

  • 无损压缩:可以使用 WebP 无损格式对图片进行无损压缩。

  • 元数据:图片中可能有存储于可交换图片文件中的元数据 格式 (Exif) 或可扩展元数据平台 (XMP) 格式。

  • 透明度:图片可以具有透明度,即 alpha 通道。

  • 颜色配置文件:图片可能具有如国际色彩联盟所述的嵌入式 ICC 配置文件。

  • 动画:同一张图片可能包含多个帧,帧之间会暂停播放; 使其成为动画

在图片(和多媒体)文件格式中,​RIFF​ 是一个容器格式,或者说是一种文件结构规范,而不是一种图片编码格式本身。

您可以把它理解为一个盒子或文件夹,里面可以装各种不同的东西(图片数据、音频数据、元数据等)。

RIFF

RIFF​ 的全称是 ​Resource Interchange File Format​(资源交换文件格式),由微软公司在1991年提出。

它的核心思想是:​所有数据都存储在称为“块(Chunks)”的结构中。

RIFF 文件的结构

一个典型的 RIFF 文件由以下几个部分组成:

​- RIFF 头(Header)​​:
- RIFF(4字节):固定标识,表明这是一个RIFF格式的文件。 - 文件大小(4字节):从下一个字节开始到文件结尾的总大小。 - 格式类型(4字节):用四个字符代码(FOURCC)定义文件的具体类型,例如 AVI或 WAVE。 ​- 块(Chunks)​​:

在文件头之后,就是一系列的数据块。 每个块都有自己的头和信息:
- 块ID(4字节):用四个字符代码标识这个块是什么(例如 fmt是格式块,data是数据块)。 - 块大小(4字节):该块数据部分的大小。 - 块数据(可变长度):实际的数据内容。

​- 列表块(LIST Chunks)​​:

这是一种特殊的块,它本身内部又可以包含其他多个子块,用于更复杂的数据组织。

​用个比喻来说:

一个 RIFF 文件就像一个行李箱(RIFF Container)​,上面贴着一个标签写着“摄影器材”(格式类型= PHOT)。箱子里面有几个收纳盒(Chunks)​,每个收纳盒上又贴着“镜头”、“机身”、“电池”等标签(块ID)。这样就可以井井有条地存放所有东西。

与图片格式的关系

RIFF 作为一种容器,被用于多种图片格式。最著名的例子就是WebP:

一个典型的 WebP 文件结构如下:

RIFF Header (标识这是一个RIFF文件,格式类型为 'WEBP')
|
+-- VP8 (或 VP8L, VP8X) Chunk (存储实际的图片编码数据)
|
+-- ANIM Chunk (可选,如果存在则表示是动画WebP)
|
+-- ANMF Chunk (可选,动画帧数据)
|
+-- EXIF Chunk (可选,存储EXIF元数据)
|
+-- XMP  Chunk (可选,存储XMP元数据)
|
+-- ... (其他可选块)

WebP的强大之处在于它利用了RIFF容器的可扩展性,可以轻松的在一个文件中包含静态图、动画、Alpha透明度、元数据等多种信息。

简单来说:

  • RIFF: 是一种文件结构或容器规范,可以比喻成行李箱
  • JPEG、PNG: 是一种图片编码格式,可以比喻成一种折叠衣服的方法。注意PNG拥有自己独特的、与RIFF无关的容器结构。
  • WebP: 使用RIFF容器来包装VP8编码数据的图片格式,可以比喻成用行李箱装了特定方法折叠好的衣服