ZeroTool Workbench

GIF 压缩工具

在线压缩 GIF 动图,文件不上传:有损 LZW、减少颜色、缩小宽度、抽帧,并对比压缩前后体积。全部在浏览器本地完成。

100% 浏览器端运行 数据不离开你的设备 免费 · 无需注册

Drop a GIF here, or click to select

You can also paste a copied GIF file with Ctrl/Cmd+V

Animated or static GIF (GIF87a / GIF89a)

阅读完整使用指南 GIF 压缩教程:用有损 LZW 和减少颜色压缩 GIF 动图大小

使用步骤

  1. 把 GIF 拖进上传区,或点击选择文件,也可以用 Ctrl/Cmd+V 粘贴已复制的 GIF 文件。
  2. 载入后页面会按当前设置自动压缩一次,左右并排显示原图和结果,并给出两者的体积。
  3. 调整设置后点「压缩」重新生成。编码开销较大,拖动滑块时不会实时重算。
  4. 点「下载 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%)。只有在颜色数很少、渐变出现明显色带时才值得打开。