ZeroTool Workbench
GIF 压缩工具
在线压缩 GIF 动图,文件不上传:有损 LZW、减少颜色、缩小宽度、抽帧,并对比压缩前后体积。全部在浏览器本地完成。
使用步骤
- 把 GIF 拖进上传区,或点击选择文件,也可以用 Ctrl/Cmd+V 粘贴已复制的 GIF 文件。
- 载入后页面会按当前设置自动压缩一次,左右并排显示原图和结果,并给出两者的体积。
- 调整设置后点「压缩」重新生成。编码开销较大,拖动滑块时不会实时重算。
- 点「下载 GIF」保存结果,文件名为
{原名}-compressed.gif。
各项设置如何影响体积
| 设置 | 作用 | 对体积的影响 |
|---|---|---|
| 有损程度(0–100,默认 40) | 允许 LZW 复用颜色偏差在「有损程度 × 0.6」以内的序列 | 对视频类 GIF 通常效果最明显。一段 231 帧录屏:40 时为原图的 42%,100 时为 19% |
| 颜色数(256 到 4) | 颜色表大小,其中 1 位留给透明 | 颜色越少,编码越短、重复越多。原图用到的颜色不超过可用数量时,调色板保持原色不变 |
| 宽度 | 等比缩小,高度自动跟随 | 像素数按缩放比例的平方下降:宽度减半,数据量约为四分之一 |
| 帧 | 每 2、3 或 4 帧保留 1 帧 | 需要存的帧变少。保留帧的显示时长会加上被丢弃帧的时长,动画总时长不变 |
| 抖动 | Floyd–Steinberg 误差扩散 | 颜色少时渐变更平滑,但文件通常更大 |
宽度只能缩小。留空、填 0 或大于原宽,都按原宽处理。缩放时,每个输出像素取它覆盖的原像素的面积加权平均;不透明部分不足一半的输出像素变成透明。
帧延迟以 10 ms 为单位写入,最小 20 ms。原文件写 0 或 10 ms 的帧按 100 ms 写入,因为浏览器实际就是这样播放的。
帧优化原理
GIF 的每一帧不必覆盖整张画布。本工具的第一帧总是完整写入;之后每一帧都和屏幕上已显示的画面比较,只写包含变化像素的最小矩形。矩形内没变的像素用透明色,让上一帧透出来,同时连成长串,压缩效果更好。完全没变化的帧只写 1 个透明像素,保留它的延迟。
透明像素还要多处理一步:原本可见的像素要变成透明时,在上面画一个透明像素没有任何效果。这时本工具把前一帧的处置方式设为 2(恢复为背景),并把前一帧的矩形扩大到覆盖这些像素,浏览器会在画下一帧之前清空这块区域。
调色板对整段动画只生成一次。所有帧用到的颜色总数不超过颜色表容量时,颜色原样保留;否则用中值切割把颜色空间分成若干块,每块取平均色。
范围说明
- 输出始终是 GIF。WebP 转换器可以把 GIF 的第一帧转成静态 WebP;要得到动态 WebP,请在电脑上用 libwebp 自带的
gif2webp:
gif2webp -lossy -q 75 in.gif -o out.webp
- MP4 往往比同样内容的 GIF 小好几倍,请在电脑上用 ffmpeg 转换。宽或高是奇数时加上
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2",因为 yuv420p 要求偶数尺寸:
ffmpeg -i in.gif -movflags +faststart -pix_fmt yuv420p out.mp4
- 不能裁剪、重排或编辑帧。要把 GIF 拆成 PNG 帧,请用 GIF 拆帧工具。
- 尺寸上限:解码后 5000 万像素、1000 帧、单帧 16,777,216 像素。
- JPEG、PNG、WebP 图片请用图片压缩工具。
相关工具
FAQ
GIF 会被上传到服务器吗?
不会。文件通过 File API 读取,由本页 JavaScript 在浏览器里解码、重新编码,结果直接从内存下载。本地只保存压缩设置(有损程度、颜色数、帧、抖动);宽度随文件而定,不保存。GIF 原图和压缩结果从不写入任何存储。
「有损程度」滑块做了什么?
GIF 用 LZW 压缩像素:一串像素和之前出现过的序列重复得越多,文件越小。有损程度大于 0 时,编码器可以把某个像素写成相近的调色板颜色,只要这样能接上字典里已有的序列。允许的最大偏差是「有损程度 × 0.6」(RGB 空间中的距离):默认值 40 对应 24,100 对应 60。帧与帧之间,与屏幕上已显示内容的距离在这个范围内的像素算作没变,不再重画。透明像素永远不会被改动。设为 0 时像素原样写入。
为什么压缩后有时比原图还大?
有些 GIF 已经优化过,比如用 gifsicle -O3 处理过,或者编码器给每一帧单独配了颜色表。本工具只写一张全局调色板,最多 255 色加 1 个透明位。原图用满 256 色、或各帧颜色不同时,需要重新量化,体积可能变大。出现这种情况页面会提示,文件照样可以下载。想要更小,可以降低颜色数、提高有损程度或缩小宽度。
能处理多大的 GIF?
上限是解码后 5000 万像素(宽 × 高 × 帧数)、1000 帧,单帧不超过 16,777,216 像素(单边 16,384 px),与 GIF 拆帧工具相同,保证手机内存够用。更大的文件请在电脑上运行 gifsicle -O3 --lossy=80 --colors 128 input.gif -o output.gif。
为什么默认关闭抖动?
抖动用相邻调色板颜色的像素点交错排列,模拟调色板里没有的颜色。这种点阵每一帧都不一样,画面静止的区域也会变,于是能算作「没变」的像素大幅减少,LZW 也更难找到重复。实测一段 231 帧的录屏,64 色下打开抖动后体积是关闭时的 1.9 倍(从原图的 42% 升到 80%)。只有在颜色数很少、渐变出现明显色带时才值得打开。