免费浏览器端媒体工具
GIF 为什么发灰、为什么这么大?
GIF 每一帧最多只能有 256 种颜色,于是渐变和暗部变成一层层色带;即便如此,文件仍然比同一段 MP4 大 20 到 30 倍。下面是用实测数字标出的每一项设置到底在花什么。
GIF 为什么发灰、为什么这么大?
GIF 每一帧最多只能有 256 种颜色,于是渐变和暗部变成一层层色带;即便如此,文件仍然比同一段 MP4 大 20 到 30 倍。下面是用实测数字标出的每一项设置到底在花什么。
先说结论
两个抱怨来自同一个地方:GIF 是 1987 年的格式。它每帧最多保存 256 种颜色,也没有真正的帧间压缩,只是简单复用没变化的区域。于是渐变塌成一层层色带,而文件依然比同一段视频大出好几倍。实测中,源文件一帧有 5,751 种颜色,导出的 GIF 一帧只有 246 种。
颜色是在哪一步丢掉的
在写出任何一帧之前,编码器必须先决定它只能用哪 256 种颜色。我们的做法是两遍:先扫描整段素材生成一张调色板,再把每一帧映射到这张调色板上。两遍法的好处是平坦区域保持干净、不会闪烁 —— 单遍编码器逐帧挑色,调色板会在你脚下不断变化。
代价是这张调色板是全局的。一段同时包含日落和深蓝夜空的素材,必须把 256 个槽位分给两个差别很大的色域,色带就是在这些素材上变得明显。这也解释了为什么 GIF 处理纯色界面和简单插画的效果,远好于照片和影片。
每一项设置花掉多少体积
下面所有数字都来自与工具完全相同的滤镜链,素材是一段色彩丰富的 640x360 片段。
- 宽度(4 秒、10fps):320px 得到 892 KB,480px 得到 1.86 MB,640px 得到 3.10 MB。
- 帧率(480px、4 秒):8fps 得到 1.48 MB,10fps 得到 1.86 MB,15fps 得到 2.83 MB,20fps 得到 3.77 MB。
- 时长(480px、10fps):2 秒得到 897 KB,4 秒得到 1.86 MB,6 秒得到 2.71 MB。
- 作为对照,同样 4 秒、480px、10fps 的 H.264 MP4 只有 70.7 KB —— 同一段内容的 GIF 是它的 26 倍。
要压到指定体积以内
在这个区间里,宽度和帧率都近似线性:宽度从 480px 降到 320px,像素数变成 44%、文件降到 48%;帧率从 10 降到 8,帧数少 20%、文件降到 80%。而时长是唯一会改变 GIF 实际内容的那个杠杆。
- 200px / 8fps / 4 秒:308 KB —— 在手机屏上仍然看得清的最小档位。
- 240px / 10fps / 4 秒:540 KB。
- 320px / 8fps / 4 秒:708 KB。
- 320px / 10fps / 4 秒:892 KB。