微信表情包制作器
Overview
把用户手里的图变成微信可发的表情包:在图上叠加有趣文案;或把一张大图(九宫格、长条表情、连续帧截图)切割 / 规范化成符合微信表情开放平台上传规格的小图。痛点有四——① 很多人不会 PS;② 想加字但不懂操作;③ 想到了图却想不到好文案;④ 尺寸/体积不合微信规范,过不了审。本 Skill 用「AI 文案建议 + 一键绘制 + 微信规格切割」解决:先看图给几条文案让你挑,再把你选的那条画到图上;或是把大图切成 240×240、透明 PNG、≤500KB、编号 01… 的成套表情主图。
When to Use(触发场景)
- 用户说"帮我做个表情包""在这张图上加点字/配个梗"
- "结合这张图的表情/场景给我写个搞笑文案""生成微信表情包"
- "给这张图配文字发群里""批量给几张图都加字"
- "把这张九宫格/长图切成表情""按微信规格切图""表情包尺寸不符合上传要求"
- 用户手里有图、想发微信但缺文案、不会排版、或图太大/比例不对过不了审时
能力分层(关键:两层各司其职)
本 Skill 不是把一切塞进脚本,而是明确分工:
- AI 文案层(智能体负责,非脚本):读取用户图片,理解场景/人物表情/动作,生成 3–5 条不同风格的恶搞/有趣文案候选(如毒舌、自嘲、阴阳、沙雕、摆烂),交给用户挑选或自定。这是 LLM 能力,run.py 不做文案生成。
- Pillow 绘制/切割层(
scripts/run.py负责):
- 绘制:接收用户选中的文案,把文字绘制到图上。支持位置(上/中/下/自定义)、字号、颜色、经典白描边+阴影、可选 emoji、多行自动换行。
- 切割/规范化(V1.1.0 新增):把一张大图按网格(--rows/--cols)切成多张,每张自动规范化为微信表情主图最优格式——默认 240×240 px、透明背景 PNG、单张 ≤500KB、编号 01/02…;也可切成缩略图(120)、聊天图标(50)等规格。支持单列/单行切长图、单图居中裁方规范化。
执行原则(最小必要 · 防过度执行)
功能较多,每次只做用户明确要求的事,绝不擅自堆叠:
- 只画用户选中的文案:AI 给了候选,但除非用户选定或自定,否则不画图;不替用户"顺便"多选几条或擅自加 emoji/改图。
- 绘制参数保持克制:位置默认底部(
bottom,表情包经典)、颜色默认白字黑描边、字号默认按图宽自适应。--emoji/--stroke/ 自定义位置都是"用户不提就不用"的开关。 - 切割按需触发:只有用户要"切图 / 按微信规格导出 / 尺寸不合要求"时才用
--split;普通加字流程不碰切割。 - 不文生图:本 Skill 只处理用户已提供的图,绝不 AI 生成人脸或凭空画图(见红线)。
- 意图模糊先确认:用户只说"做个表情包"但没给图也没给文案时,先要图;有图无文案时走 AI 建议流程给候选,让用户选,不默认替他定一条。
- 引导用户:用户不知道怎么用时,直接给 1–2 条最贴合的
run.py示例,或引导看USAGE.md。
使用流程
- 拿图:确认用户提供的源图片(单张或目录)。
- 出文案(仅当用户未自定文案时):智能体读取图片,生成 3–5 条多风格文案候选,交给用户挑选或自定。
- 确认绘制参数:位置/字号/颜色/描边/emoji,用户未指定则用默认(底部、白字黑边、自适应字号)。
- 执行:把选中文案作为
--text传给scripts/run.py(AI 文案层的结果在此落地)。 - 输出:保存为
--output(默认同目录),文件名带_表情包标记。 - (按需)切割/规范化:若用户要从大图产出成套微信表情主图,用
--split模式(见下),输出 01/02… 编号的 240×240 透明 PNG。
扩展能力(能力升级)
--title顶部独立标题:与--text构成「大标题 + 副标题/说明」双行排版(标题字号自动为文案的 1.15 倍),适合「一句话梗 + 图注」式表情包。--transparent透明背景贴纸:仅画字、无底图,生成透明 PNG(微信表情贴纸常用),可省--input,用--width/--height指定画布(默认 800×800)。适合把金句做成独立贴纸。--format png/jpg输出格式:默认jpg(微信表情包体积友好);指定png无损;--transparent自动强制png。--split切割 / 微信最优尺寸规范化(V1.1.0 新增):把一张大图按网格切成多张,每张规范化为微信表情主图最优格式。详见下节。
--split 切割 / 微信规格导出(重点)
把"一张大图"变成"成套微信表情主图",满足微信表情开放平台投稿要求(规格详见 references/wechat_spec.md):
- 网格切图:
--rows R --cols C把图切成 R×C 张(如九宫格--rows 3 --cols 3、四格--rows 2 --cols 2)。每张切片自动「等比缩放到目标边长 + 居中留边」成正方形画布,避免拉伸变形。 - 单图规范化:不指定
--rows/--cols(默认各 1)即把单张大图「居中裁方 + 缩放」成目标边长的正方形(默认 240,即微信表情主图规格)。 - 目标规格:
--target-size目标边长(像素),默认240(微信主图);设120出缩略图、设50出聊天面板图标。注:横幅 750×400 非正方形,本模式只做正方规格,横幅请另行处理或后续扩展。 - 留边色:
--pad transparent|white|black,默认transparent(透明背景,微信主图/封面推荐);JPG 源图无透明通道时透明留边会生成带透明边的 PNG,仍可被微信接受;想要白底用--pad white。 - 体积上限:
--max-kb单张最大体积(KB),默认500(微信主图上限);超出自动逐级缩小直至满足,仍超则告警提示人工核查。 - 编号命名:输出
原图_01.png、原图_02.png…,全局连续编号,与微信"上传顺序即展示顺序 / 编号 01,02,03"一致。 - 可叠加文案:切割模式下仍可传
--text/--title,为每张切片统一加字(如系列梗)。
三种典型流程
- 流程 A(AI 建议):给图 → AI 出候选 → 用户选 1 条 → 绘制 → 返回
- 流程 B(用户自定):给图 + 自己写文案 → AI 直接绘制,不出候选
- 流程 C(多图):每张图单独配文,或统一文案批量出
- 流程 D(切割/规范化,V1.1.0):给大图 →
--split网格切 / 单图裁方 → 输出编号 01… 的 240×240 透明 PNG 表情主图
scripts/run.py 用法
# 底部白字黑描边(表情包经典),文案由用户/AI 选定后传入
python scripts/run.py --input photo.jpg --text "这波操作\n我给满分" --output ./out
# 指定位置 + 字号 + 颜色
python scripts/run.py --input photo.jpg --text "我裂开了" --position top --font-size 48 --color white --output ./out
# 加 emoji 点缀
python scripts/run.py --input photo.jpg --text "摸鱼ing" --emoji "🐟" --output ./out
# 批量:目录内统一文案
python scripts/run.py --input ./photos/ --text "今日宜摆烂" --output ./out
# 扩展①:顶部独立大标题 + 副标题(双行排版)
python scripts/run.py --input photo.jpg --title "打工人" --text "今日宜摸鱼" --output ./out
# 扩展②:透明背景贴纸(仅画字,无底图,微信贴纸常用;可省 --input)
python scripts/run.py --text "稳住,能赢" --transparent --width 800 --height 800 --output ./out
# 扩展③:指定输出格式 png(无损)
python scripts/run.py --input photo.jpg --text "原图质感" --format png --output ./out
# 新增④:九宫格切图 → 编号 01..09 的 240x240 透明 PNG 表情主图
python scripts/run.py --split --rows 3 --cols 3 --input grid.png --output ./out
# 新增⑤:单张大图居中裁方 → 规范成 240x240 微信主图
python scripts/run.py --split --input big.png --output ./out
# 新增⑥:切缩略图(120x120,微信缩略图规格)
python scripts/run.py --split --target-size 120 --input grid.png --output ./out
# 新增⑦:切片后给每张统一加字(系列梗)
python scripts/run.py --split --rows 3 --cols 3 --input grid.png --text "系列梗" --output ./out
# 新增⑧:留白底而非透明边
python scripts/run.py --split --input big.png --pad white --output ./out
参数说明:
--input:图片文件或目录(非透明模式必填;--transparent模式可省略;--split模式必填)--text:要绘制的文案(与--title至少一项;用\n换行;由用户选定或自定,AI 不在此生成)--title:可选,顶部独立大标题(与--text构成双行标题+副标题)--position:文字位置top/center/bottom(默认bottom)--font-size:字号像素;省略则按图宽自适应(约宽/12;透明/标题模式约宽/14)--color:文字主色,默认white--stroke:描边色,默认black(经典白字黑边)--stroke-width:描边宽度,默认3--emoji:可选,叠加的 emoji 字符,默认无--transparent:开关,生成透明背景 PNG 贴纸(仅画字、无底图);画布用--width/--height指定,默认 800×800--width/--height:透明贴纸画布尺寸(像素),默认 800×800--format:输出格式png/jpg(默认jpg;--transparent自动强制png)--output:输出目录或文件;省略则输出到源文件同目录--split:开关,启用切割/微信规格规范化导出模式--rows/--cols:网格切图行/列数(默认各 1,即单图裁方规范化);需为正整数--target-size:切割输出正方形边长(像素),默认240(微信主图规格);可设120(缩略图)/50(图标)--square/--no-square:单图模式是否居中裁方(默认--square开启;--no-square改为留边不裁切)--pad:切割留边色transparent/white/black(默认transparent)--max-kb:切割单张体积上限(KB),默认500(微信主图上限);超出自动缩小
> 本脚本为安全版:不含 import re、不含三引号 docstring、不含 f-string、使用 # 行注释,规避 SkillHub 发布 566 内部错误。
依赖
- Pillow:
pip install pillow(用户环境需安装;跨平台支持) - 中文字体:
run.py运行时自动探测系统字体(Windowsmsyh.ttc/ macPingFang.ttc/ Linuxwqy-zenhei.ttc等),不硬编码任何平台独占路径;若系统无中文字体则报错提示安装。
红线与边界
- 不做 AI 文生图、不生成人脸;只处理用户提供的现有图片
- 文案合规红线:不生成涉政治、色情、人身攻击、侮辱诽谤、侵犯他人权益/版权的文案;恶搞有度,面向微信社交场景
- 与「智能图片尺寸与格式转换器」的边界:本 Skill 的切割/规范化仅服务于微信表情包导出场景(240/120/50 等微信规格与体积上限),不替代通用尺寸/格式工具;如需脱离微信场景的纯尺寸转换,交由「智能图片尺寸与格式转换器」处理。横幅 750×400 等非正方规格本模式不自动产出。
- 跨平台红线:
scripts/内一律使用相对路径与标准库,禁硬编码~/.workbuddy等平台独占绝对路径
Resources
scripts/run.py:图片绘制 + 切割主程序(Pillow,安全版;字体探测 + 文字绘制 + 描边 + 换行 + 网格切图 + 微信规格规范化)references/style_presets.md:字体探测顺序、描边/位置预设、文案风格说明(按需加载)references/wechat_spec.md:微信表情开放平台投稿规格速查(主图/缩略图/封面/横幅/图标尺寸体积与数量要求)
反模式(不要这样做)
- 不要用本 Skill "生成"或"凭空画"一张表情包——它只处理用户已提供的图;整图 AI 生成属文生图范畴,超出边界。
- 不要替用户擅自多选文案、擅自加 emoji 或改图——只画用户选定/自定的那一条(防过度执行)。
- 不要生成涉政/色情/人身攻击/侵权类文案——合规红线,恶搞不等于无底线。
- 不要在
scripts/内硬编码~/.workbuddy或具体系统字体绝对路径——跨平台红线;字体必须运行时探测。 - 不要在本脚本加入
import re、三引号 docstring 或f-string——会触发 SkillHub 发布 566 内部错误。 - 切割时不要把"通用尺寸转换"当成目标——切割/规范化只为满足微信表情上传规格,不是通用改尺寸工具。