表情包循环动图制作(Meme Loop Animator)
概览
把一张角色参考图变成可直接使用的循环动画表情包:参考图 → 原地循环动画视频(首帧锚定)→ 按帧率抽帧 → 背景透明化(可选)→ GIF 动图(+ 可选精灵图 / 帧序列)。
默认只交付一个微信尺寸(≤500KB)的 GIF 动图;循环视频是中间产物不保留,精灵图与帧序列为可选产出。背景默认 AI 抠图透明,也可选保留原背景(none)。
全流程强制完整执行,不提供"只生成视频"或"只抽帧"的降级路径。
工作流
第 0 步:参数确认(整批一次,问清即开工)
用提问工具向用户确认以下内容,规格必须写在问题正文里:
| 参数 | 默认值 | 说明 |
|---|---|---|
| 动作与方向 | 无默认 | 如"猩猩吃香蕉",按用户原话 |
| 时长 | 4 秒 | 循环动画 3~5 秒足够 |
| fps | 8 | 抽帧帧率 |
| 起始时间 | 第 2 秒 | 从视频第 2 秒开始抽帧,跳过开头常见的姿态过渡 |
| 精灵图排布 | strip(横向单行) | 可选 grid(网格,列数自动) |
| 背景 | 透明(rembg) | 背景复杂用 rembg AI 抠图;纯色背景用 color;保留原背景用 none |
| 输出尺寸 | 320px(微信) | 长边最大像素,--resize 0 为全分辨率(不缩放) |
确认正文需写明:产出什么(默认只出 GIF;精灵图为可选、仅游戏引擎贴图需要;帧序列可选保留;视频为中间产物不交付)、规格(时长/画幅/fps/起始时间/排布/背景/尺寸)、使用的参考图路径。画幅默认跟随参考图比例。
第 1 步:环境准备
- 检查 Pillow:
python -c "import PIL",缺则pip install pillow - ffmpeg 由脚本自动发现(环境变量 FFMPEG_PATH → 系统 PATH → imageio-ffmpeg 包);都没有则
pip install imageio-ffmpeg - 背景透明化默认走 rembg:
python -c "import rembg",缺则pip install rembg(首次运行自动下载模型,属正常等待,不要当成故障) - 若选
none(保留背景)且需要纯色快抠,则不需要 rembg,但color模式需要 numpy
第 2 步:生成循环动画视频(首帧锚定)
优先用 mcp__miora__miora_frame_to_video:先调用 connect_cloud_service 预检获取 clientTempToken,再以其作为 tempKey 调用,参考图必须作为 first_frame 传入。提示词按 references/video-prompting.md 构建,核心是"原地循环三条硬约束"(动作原地发生、点位尺寸不变、相机静止)。
轻量化(生成时就走低分辨率):miora_frame_to_video 的 resolution 参数仅接受 768P / 2K(实测传入 480p 会被拒),默认即 768P,无法在视频生成阶段低于 768。因此“小尺寸”只能靠下游脚本的 --resize 兜底;resolution 在此仅用于选择 768P 或 2K(2K 更大更慢,不推荐)。
回退通道(实战必需):若当前会话的延迟工具索引里找不到 miora_frame_to_video,改用 VideoGen 工具(用 ToolSearch 发现)。VideoGen 同样支持 image-to-video:把参考图绝对路径传入 image 参数、seconds 设为确认时长、prompt 写入同样的循环约束,并省略 aspect_ratio(画幅由输入图决定)。VideoGen 直接返回本地 mp4 路径,无需二次上传。
水印提示(实战必知):VideoGen 回退通道会在生成的视频左上角叠加一个半透明浅色小框(含浅字,逐帧固定在同一处),属静态叠加层而非画面内容。保留原背景(none)模式下它会留在成品里。用第 3 步的 --remove-watermark 可在生成时一并去除;若 GIF 已生成,用 scripts/remove_watermark.py 单独后处理即可(见第 3 步)。
提示:生成视频可能耗时几十秒到几分钟。超时报错时先用任务状态查询工具查后端状态,任务仍在跑就不要重发,绝不重复计费。
第 3 步:抽帧、背景透明化与合成
视频拿到本地文件后,运行本技能自带脚本,一站式完成抽帧 → 背景透明化 → GIF + 精灵图:
python scripts/build_gif_and_spritesheet.py \
--video <视频路径> \
--out-dir <输出目录> \
--fps 8 --start-time 2 \
--layout strip \
--bg-removal <rembg|color|none> \
--remove-watermark \
--no-keep-frames --cleanup-video
- 流程顺序固定:先抽帧,再透明化,最后合成;合成用的全部是最终成品帧
- 脚本会自动发现 ffmpeg;帧 PNG 保存在
<输出目录>/frames/ - 轻量化三连:
--resize默认已是 320(微信尺寸,无需再传);--no-keep-frames删除抽帧 PNG;--cleanup-video删除输入 mp4。三者叠加后默认只保留 GIF,最省空间。 - 精灵图(spritesheet)默认不再生成:它是游戏引擎用的纹理图集,GIF 表情包不需要,且额外占体积(透明版约 0.9MB、保留背景复杂图可达 4MB)。需要游戏引擎贴图时再显式加
--sheet。 - 背景透明化:默认
rembg(AI 抠图,适用任意背景);纯色背景用color(加--bg-color "#RRGGBB",缺省自动检测,--bg-tol调容差);none保留原始背景,不做抠图 - 去水印(可选):
VideoGen回退通道会在视频左上角叠加半透明浅色水印小框(逐帧固定)。加--remove-watermark即可在生成时一并去除——默认自动检测左上角水印包围盒,必要时用--wm-bbox x0 y0 x1 y1显式指定、--wm-feather调边缘羽化(默认 2px)。若 GIF 已经生成好,不必重跑整套流程,直接后处理:python scripts/remove_watermark.py --gif <gif路径>(默认输出<原名>_nwm.gif,同样支持--bbox/--feather/--no-detect)。去水印核心见scripts/watermark_utils.py,纯 Pillow 实现、带安全护栏(检测不到或边框过大时原样返回,绝不破坏原图)。 - 像素风保持默认(全局调色板、无抖动);非像素风可加
--dither - 保留背景(none)且色彩复杂的图若超 1MB:把
--resize降到 240 并--fps 5进一步减重。微信表情 GIF 限制约 1MB、建议 240–480px - 体积硬上限
--max-kb:默认 500KB。脚本构建 GIF 后若超上限,会自动降分辨率(长边最低压到 ~140px)仍超则隔帧抽除减少帧数,直到达标或达下限;最终尺寸以脚本摘要的 "自动缩放至 x.xx" 为准。透明背景或保留背景都适用,无需手算尺寸。 - 网格排布:
--layout grid,列数用--cols N指定(0 为自动) - GIF 为 1 位透明(
--alpha-thresh控制阈值,默认 128);none模式下 GIF 为不透明、保留背景;精灵图与帧 PNG 保留 8 位半透明 alpha - 帧序、帧数、产物尺寸以脚本输出的摘要为准,不要复述输入参数
第 4 步:交付与验收
- 汇报实际路径、使用帧数、GIF 帧间隔(全部读自脚本摘要)。默认只交付 GIF,视频 mp4 与抽帧 PNG 已删除;精灵图仅在显式
--sheet时才产出。 - 透明效果肉眼验收:帧 PNG / 精灵图看 alpha 是否干净,GIF 看透明区域是否有上一帧残影;抠图边缘发糊时可用
--rembg-model isnet-general-use提升精度 - 比对实际值与确认过的规格是否一致(时长、fps、起始时间、排布、背景)
- 人物点位/尺寸/相机"三不变"已在生成时硬约束,但动作本身的起伏属正常,请用户以成片为准
- 不承诺"画面流畅""循环无缝"等无法从数据确认的项,交由用户肉眼验收
- 验收不合格不自动重做,是否重做由用户决定
已知坑点(实战记录)
- VideoGen 回退通道会加左上角水印:生成的视频左上角有一块半透明浅色小框(含浅字),逐帧固定,属静态叠加层。保留原背景(none)模式下它会留在成品里。处理办法二选一:① 生成时给
build_gif_and_spritesheet.py加--remove-watermark;② GIF 已生成则用scripts/remove_watermark.py --gif <gif>单独后处理。自动检测在左上角按尺寸比例取清理区(长边约 20%、封顶 140px;高约 10%、封顶 48px),并用多级背景回填(正下方平移 / 右邻均值 / 外圈均值)+ 边缘羽化去除,带饱和度护栏防误伤角色;对一般视频左上角水印有效,若失败或水印位置特殊,用--bbox x0 y0 x1 y1手动框定。 - 背景保留(none)模式脚本 bug 已修:旧版
build_gif_and_spritesheet.py在--bg-removal none时会因帧为 RGB(无 alpha 通道)在 GIF 合成处崩溃。本技能已在该分支把帧转为全不透明 RGBA,背景可正常保留。 - miora 工具不可用时:部分会话延迟工具索引不含
miora_frame_to_video,此时必须改走VideoGen;VideoGen的aspect_ratio对图生视频无效,不要传。 - GIF 体积:保留背景的 GIF 因颜色信息更多,体积约为透明版的 2~2.5 倍(如 2.5 MB → 6 MB),属正常。
- 微信尺寸:
--resize默认 320px(微信建议 240–480px 区间);透明背景图 320px 通常 < 1MB,但保留背景(none)且色彩复杂的图在 320px 仍可能 > 1MB(如保留背景实拍图约 1.8MB),需降到--resize 240+--fps 5(约 880KB)才达标。 - 视频分辨率下限:
miora_frame_to_video的resolution只接受 768P / 2K,无法在生成阶段低于 768;小尺寸完全依赖脚本--resize,不要指望靠视频分辨率压。 - 无法直接出 GIF:当前 miora 工具只有视频生成模型(
frame_to_video等)能产生运动,没有“直接出 GIF/帧序列”的通道。视频是绕不开的中间产物;用--no-keep-frames --cleanup-video组合不保留任何中间文件(抽帧 PNG 与输入 mp4 都会删掉),默认只留 GIF(若显式--sheet才多一张精灵图)。
更新日志
v1.1.0(2026-10-22)
- 新增去水印能力:图生视频回退通道(VideoGen)会在成品左上角叠加半透明浅色水印小框(逐帧固定),本版本集成一键去除。
scripts/watermark_utils.py(新增,纯 Pillow):去水印核心。在左上角按尺寸比例取清理区,三级回填(正下方平移回填 / 右侧紧邻墙面均值 / 外圈均值兜底),并对右/下边缘做羽化消除接缝;带饱和度护栏,遇到高饱和角色/主体则跳过、绝不破坏原图;检测不到也原样返回。scripts/remove_watermark.py(新增):独立后处理脚本,专治「已生成好的 GIF」——python scripts/remove_watermark.py --gif loop.gif,默认输出<原名>_nwm.gif,支持--bbox手动框定、--feather、--no-detect。build_gif_and_spritesheet.py:新增--remove-watermark/--wm-bbox/--wm-feather,在抽帧后、缩放/透明化前顺手去水印(生成时一步到位)。SKILL.md:补充去水印用法、命令示例与 VideoGen 水印坑点说明。
硬约束速查
- 参考图作首帧传入,任何情况下不用纯文字生成替代
- "三不变"(点位、尺寸、相机)必须写进每条生成提示词
- 抽帧参数按用户指定值;未指定用默认值并在确认时展示
- 流程不拆开单独执行