joeseesun/qiaomu-tiny-gif
GitHub: joeseesun/qiaomu-tiny-gif
一款基于内容感知的智能 GIF 压缩工具,通过合并静止帧和逐级编码优化,将 GIF 压缩到指定体积预算内并满足微信公众号等平台的发布规范。
Stars: 1 | Forks: 0
# qiaomu-tiny-gif
[](https://github.com/joeseesun/qiaomu-tiny-gif/commits/main)
[](LICENSE)
## 为什么值得用
微信公众号正文对 GIF 有硬性规范:**≤10MB、总帧数 ≤300 帧(超出无法显示)、宽度建议 640px、帧率 12-20fps**。网上下载或录屏转出来的 GIF 动辄几十 MB、几百帧,普通压缩工具只会整体降画质。
这个 skill **默认即按公众号规范处理**,而且先看内容再压缩:**长期停留的画面合并成一帧**(零可见变化)、**微动段每隔一帧抽一帧**(播放时长不变)、**超帧率合并短时长帧、超 300 帧均匀抽帧**,最后还不够小再走"调色板 → 有损 → 缩放"编码阶梯,每一级都用最小的画质代价,达标就停。
实测:6.6MB / 60 帧(40 帧带噪静止 + 20 帧运动)→ 31KB / 21 帧;27.9MB / 70 帧高噪动画 → 8.4MB;400 帧 / 800px / 30fps 录屏 → 107 帧 / 640px / 0.21MB,全部符合规范。
## 安装
npx skills add joeseesun/qiaomu-tiny-gif
验证:
ls ~/.agents/skills/qiaomu-tiny-gif
## 你可以这样说
- "这个 GIF 要放进公众号正文,按微信规范处理一下"
- "GIF 超过 300 帧了公众号显示不了,帧数降下来"
- "这个 GIF 太大发不了微信,帮我瘦身"
- "把这个 GIF 压缩到 10M 以内"
- "减少这个动图的帧数,把长停留的部分合并掉"
- "compress this gif so I can upload it to WeChat"
## 它会做什么
1. 逐帧分析 GIF,计算每帧与上一个保留帧的"变化像素占比"和"均值灰度差"(慢速平移会累积差异,不会被误合并)
2. 合并变化像素 < 0.1% 的静止帧(时长累加,零可见变化)
3. 微动段每隔一帧抽一帧(时长累加,播放节奏不变,局部 fps 减半,默认不低于 12fps 下限)
4. 套用规范约束(默认开启):fps 超 20 合并短时长帧、超 300 帧均匀抽帧、超 640px 等比缩宽
5. 还不够小就按编码阶梯逐级收紧:256 色无损 → gifsicle 有损 → 收窄色板 → 缩放,**达标即停**
6. 输出 `-tiny.gif` 和一份完整报告(合并/抽掉多少帧、fps、宽度、每级大小、最终状态),绝不覆盖原文件
## 前置条件
- [ ] Python 3 + Pillow ≥ 9.1:`python3 -c "import PIL; print(PIL.__version__)"`(缺失则 `python3 -m pip install Pillow`)
- [ ] 推荐 gifsicle:`gifsicle --version`(缺失则 `brew install gifsicle`;没装也能跑,自动跳过有损级,效果差 20-60%)
## 输出示例
input : demo.gif (0.56 MB, 400 frames, 800x600, 33.3 fps)
profile: wechat (default)
frames: merged 213 static, dropped 80 redundant, fps-capped 0,
cap-dropped 0 -> 107 frames (8.3 fps, 640x480)
* colors=256 lossy=0 scale=1.00 -> 0.21 MB
output: demo-tiny.gif (0.21 MB) [ok]
## 直接使用脚本
不经过 agent 也可以直接跑:
# 不带参数 = 公众号规范(10MB / ≤300 帧 / 宽 640px / 12-20fps)
python3 ~/.agents/skills/qiaomu-tiny-gif/scripts/tiny_gif.py input.gif -o out.gif
# 只要 5MB 预算、不管帧数和宽度(传 0 关闭对应约束)
python3 ~/.agents/skills/qiaomu-tiny-gif/scripts/tiny_gif.py input.gif \
--max-size-mb 5 --max-frames 0 --target-width 0 --max-fps 0 --min-fps 0
| 参数 | 默认(公众号规范) | 说明 |
|---|---|---|
| `--max-size-mb` | 10 | 大小预算(MB),不可关闭 |
| `--max-frames` | 300 | 总帧数硬上限,超出时均匀抽帧(时长累加,节奏不变);0 关闭 |
| `--target-width` | 640 | 宽度超过时等比缩小到该值(不放大);0 关闭 |
| `--max-fps` | 20 | 帧率上限,合并短时长帧实现(30fps → 15fps);0 关闭 |
| `--min-fps` | 12 | 帧率低于此值给出警告(1fps 容差,无法凭空插帧);同时作为抽帧吸收的下限;0 关闭 |
| `--preset wechat` | — | 与默认值相同,保留作显式声明和未来平台扩展 |
| `--merge-ratio` | 0.001 | 变化像素占比低于此值视为静止帧并合并(0.001 = 0.1%) |
| `--drop-mean` | 0.35 | 均值灰度差低于此值视为微动段,隔帧抽取;调大抽得更狠 |
| `--no-drop` | 关 | 只合并不抽帧,最保守 |
| `--force` | 关 | 输入已达标也强制重编码(若结果变大则保留原文件) |
| `--json` | 关 | 报告输出为 JSON |
## Troubleshooting
| 问题 | 原因 | 解决 |
|---|---|---|
| 公众号正文里 GIF 不显示 | 帧数超 300、超 10MB 或帧率过高 | 默认即按规范处理,直接跑即可;确认报告里 `[ok]` |
| `budget_unreachable` | 阶梯走完仍超预算(高噪/超长 GIF) | 先用 ffmpeg 裁剪时长或缩尺寸再喂进来;或接受输出的最小版本 |
| 运动物体被误合并/误抽 | 阈值对当前内容偏激进 | 调小 `--merge-ratio` / `--drop-mean`,或加 `--no-drop` |
| 输出比源文件还大 | 源文件用了 delta 帧编码,体积本就不超标 | 若帧数/宽度/fps 已达标,脚本会直接报 `already_compliant` 不处理;只有源文件违反规范约束时才会重编码,结果仍在预算内 |
| 输出比预期画质差 | 走到了缩放级 | 预算适当放宽,或先裁剪时长 |
| 速度很慢 | 每级阶梯重编全部帧 | 正常,70 帧 640×480 全阶梯约 1 分钟;先合并抽帧已能省掉大多数情况 |
| `Pillow is required` | 未装依赖 | `python3 -m pip install Pillow` |
| 处理后帧数没少 | 原 GIF 各帧都有明显变化 | 正常,此时靠编码阶梯压缩;帧数精简只针对静止/微动段 |
## 风险与边界
- 只读写本地文件,无网络、无账号、无密钥。
- 默认允许轻度有损(gifsicle lossy、色板收窄);要求逐帧无损的场景不适用。
- 不做视频转 GIF、GIF 转视频、内容裁剪——那些请用 ffmpeg。
- 超大 GIF(几千帧 4K)全量载入内存,建议先 ffmpeg 缩尺寸。
## 关于向阳乔木
向阳乔木(乔向阳 / Joe)是一位实践型 AI 产品与内容创作者,长期把前沿 AI 变化转译成可复用的工作流、产品判断、AI 编程实践、AI 搜索实践和 GEO/AI 营销方法。
- 个人网站: https://qiaomu.ai
- 博客: https://blog.qiaomu.ai
- X: https://x.com/vista8
- GitHub: https://github.com/joeseesun/
- 微信公众号: 向阳乔木推荐看
### 支持与关注
| 打赏支持 | 微信公众号 |
|---|---|
|
|
|
| 感谢支持乔木持续分享 AI 实践 | 扫码关注「向阳乔木推荐看」 |
## License
MIT — Copyright (c) 向阳乔木 · [X @vista8](https://x.com/vista8) · [GitHub @joeseesun](https://github.com/joeseesun/)
|
|
| 感谢支持乔木持续分享 AI 实践 | 扫码关注「向阳乔木推荐看」 |
## License
MIT — Copyright (c) 向阳乔木 · [X @vista8](https://x.com/vista8) · [GitHub @joeseesun](https://github.com/joeseesun/)标签:AI技能, GIF压缩, 图像处理, 多媒体工具, 微信生态, 视频编码, 逆向工具