GIF格式详解 — 256色调色板与动图
整理了 1987 年 CompuServe 创建的 GIF 格式的历史(87a·89a)、256 色调色板、LZW 无损压缩、仅一种颜色透明的方式、动画原理与文件结构,以及何时用 WebP 或视频替代 GIF 更好。
GIF(Graphics Interchange Format)是美国在线服务商 CompuServe 于 1987 年发布的格式,1989 年的修订版 GIF89a 加入了用于透明色和动画的扩展块。它从互联网早期就开始使用,至今仍是“动图”的代名词,但从技术上看,它属于最古老的一批格式。
256 色调色板与 LZW 压缩
GIF 并不为每个像素直接保存颜色,而是保存该像素是最多 256 色调色板(颜色表)中的第几号颜色。按照规范,颜色表的大小为 2 的幂,最多 256 项。这组编号再用 LZW 算法进行无损压缩。
压缩本身是无损的,但把拥有 1,600 多万种颜色的照片减少到 256 色的过程中会产生很大损失。天空、皮肤这类平滑渐变会表现为点状花纹(抖动)或色带。相反,颜色较少的像素画和简单图形则能保存得既小又清晰。
LZW 算法曾一度存在专利问题,这也是 1990 年代开发 PNG 的契机之一。相关专利早已到期。
透明度
GIF89a 的图形控制扩展(Graphic Control Extension)中有一个用来指定 透明色编号 的字段。该编号的像素不会被绘制到屏幕上,而是保留背景。也就是说,透明只有“完全透明或完全不透明”两种,无法表现半透明阴影或柔和边缘。因此,把透明 GIF 放在其他颜色的背景上时,边缘常常会出现白边(光晕)。
动画
GIF 动画是按顺序显示多张图像的方式,帧与帧之间的延迟时间按规范以 1/100 秒为单位 指定。循环次数则由之后被广泛使用的扩展块(NETSCAPE2.0)来设定。
文件结构
GIF 文件以 GIF87a 或 GIF89a 这 6 字节签名开头,随后依次是以下各块:
- 逻辑屏幕描述符:整个画布的宽高和背景色编号
- 全局颜色表:整个文件使用的调色板(可选)
- 图形控制扩展:下一帧的延迟时间、透明色编号、帧处置方式(89a)
- 图像描述符与图像数据:帧的位置和尺寸、必要时的局部颜色表,以及 LZW 压缩数据
- 3~4 按帧数重复,最后是结束字节(3B)。
每一帧都可以有自己的局部颜色表,所以理论上整体可以使用超过 256 种颜色,但在单帧之内仍然受 256 色限制。
优点与局限
- 兼容性:所有浏览器、聊天软件以及几乎所有程序都能播放,包括动画。
- 体积效率低:每一帧都单独以 256 色压缩,装入照片类影像时文件会非常大。Google 表示,动态 WebP 可以比 GIF·APNG 体积更小。
- 颜色与透明度受限:只有 256 色和 1 位透明。
主要用途与替代格式
在简短的表情反应图、加载图标、像素画等 最看重到处都能播放 的场合仍在使用。如果是要放到网站上的动态图片,动态 WebP·AVIF 或短视频(MP4·WebM)要小得多,也清晰得多。
转换时的注意事项
- GIF → JPG·PNG:大多数工具只把第一帧保存为静态图片。
- PNG·JPG → GIF:会被减少到 256 色,照片的画质会大幅下降。除非是 Logo 或图形,否则不建议。
- 将静态图片转换为各种格式的方法请参阅 图片格式转换。