joeseesun/qiaomu-tiny-gif

GitHub: joeseesun/qiaomu-tiny-gif

一款基于内容感知的智能 GIF 压缩工具,通过合并静止帧和逐级编码优化,将 GIF 压缩到指定体积预算内并满足微信公众号等平台的发布规范。

Stars: 1 | Forks: 0

# qiaomu-tiny-gif [![Last commit](https://img.shields.io/github/last-commit/joeseesun/qiaomu-tiny-gif?style=flat-square)](https://github.com/joeseesun/qiaomu-tiny-gif/commits/main) [![License](https://img.shields.io/github/license/joeseesun/qiaomu-tiny-gif?style=flat-square)](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技能, GIF压缩, 图像处理, 多媒体工具, 微信生态, 视频编码, 逆向工具