帧率: 越高 = 越流畅但文件越大
最大宽度: 自动缩放并保持宽高比
调色板颜色数: 颜色越少 = 文件越小、质量略降
动画 GIF 转换:按所选帧率提取帧、缩放到最大宽度、并为循环构建优化的调色板。音频轨(若有)会被丢弃。
为什么 GIF 这么大?调色板、抖动和干着视频活儿的 1987 年格式
GIF(Graphics Interchange Format,1987)本是带一点动画彩蛋的静态图像格式,这一点处处可见。两个特性决定本页的一切:每帧最多只能用从一个存储调色板中选出的 256 色,帧用 LZW 压缩——一个来自 zip 时代的通用字节压缩器——完全不知道自己装的是视频。没有运动补偿,没有真实视频编解码器那种"这帧基本和上一帧一样"的算术;每帧本质上是一张单独压缩的图片。理解调色板是做出又小又好看 GIF 的关键。
五个锚定全页的事实:
• 每帧最多携带 256 色(28)的调色板;真彩视频必须量化降色
• 抖动 用散布相邻调色板色点的方式伪造缺失颜色——文件更大、渐变更平滑
• 帧计时以 10 ms 为单位存储:10 fps → delay 10(100 ms);实用下限是 delay 2(20 ms = 50 fps)
• 帧各自独立 LZW 压缩——没有帧间压缩是体积杀手第一名
• 更少颜色、更少帧、更小尺寸:每个旋钮都缩减 LZW 输入,效果相乘
256 色调色板与色带
真彩视频的一个像素需要 24 位(1670 万种可能);GIF 像素是一个 8 位索引,指向最多 256 色的表。因此视频转 GIF 要跑调色板量化:选出最能代表内容的 256 色,再把每个像素吸附到最近的一色。渐变付出代价——一片需要 4000 种略有差异的蓝色的天空只剩 30 种,平滑的斜坡塌缩成可见的条纹,即色带(banding)。高对比扁平图形(logo、游戏精灵、图表)几乎无感;照片和视频受伤最重。转换器的调色板质量是其输出质量的大头。
抖动:用噪声换平滑
抖动是色带的经典解法:与其把每个像素吸附到最近的调色板色,不如把最近的两个颜色散布混合,让小面积上的平均值匹配原始色调。渐变看起来平滑得多——条纹溶解成眼睛在正常观看距离下会自动融合的细噪声。代价是文件大小:噪声是高频细节,LZW 压规则条纹远好过散点。这正是本页暴露的 GIF 根本取舍:关抖动得带色带的小文件,开抖动得花体积的平滑渐变。
帧计时:20 ms 下限
GIF 以 1/100 秒为单位存储帧间延迟。10 fps 意味着 delay 10(每帧 100 ms);20 fps 意味着 delay 5(50 ms)。最小实用值是 2(20 ms,即 50 fps),而实际上多数浏览器把低于此值的延迟钳到 100 ms——要 60 fps 会悄悄产生更慢的播放。越过下限后,每提高 1 fps 都成倍增加帧数:同一段素材 15 fps → 50 fps 意味着三倍多的帧,GIF 大小大致随帧数线性增长。10 秒素材 15 fps 是 150 帧;50 fps 就是 500 帧。
为什么 GIF 比真视频膨胀那么多
现代视频编解码器把大部分比特花在描述帧间变化上——锁定的机位意味着后面的帧几乎不花钱。GIF 的 LZW 把每帧当全新图像(唯一的帧间技巧是一个跳过与前帧相同像素的透明标志,远不如真正的运动补偿)。经验法则:同一段素材,GIF 会是同分辨率精心编码的 WebM 的许多倍。如果目标位置接受真视频,优先真视频;GIF 只在通用性和自动播放/循环行为重要的地方获胜。
常见误区
- "GIF 是压缩的,所以适合存视频。"LZW 是 1987 年的无运动模型字节级压缩器;对动态画面它是 Web 上效率最低的常用格式。
- "我的源是 60 fps,GIF 也应该是。"20 ms 延迟下限把 GIF 封顶在 50 fps,而且浏览器会把低于下限的延迟向上钳。逐帧保真不是 GIF 能给的。
- "抖动只是噪声,应该关掉。"它是深思熟虑的质量/体积取舍:关掉得带色带的小文件,打开得花字节的平滑渐变。
- "颜色少了肯定难看。"对扁平图形和高对比动画,64 色也能和 256 色看起来一样——还能让文件更小。
相关工具:视频转 WebP/APNG(带真压缩的真彩动画)、GIF 转视频(反方向:调色板回真彩)、视频转 WebM(同一段素材的真视频)、视频剪切器(转换前先修剪源)。