| name | meitu-id-photo |
| description | 生成标准证件照(一寸、二寸、护照、签证等)。自然美颜 + AI 重绘(换正装 + 纯色背景 + 规格裁剪)。当用户提到证件照、一寸照、二寸照、白底照片、蓝底照片、红底照片、passport photo、ID photo、签证照、驾照照片、身份证照、证件照换底色、证件照尺寸时触发。 |
| version | 1.0.0 |
Overview
接收一张人物照片,按指定证件照规格(尺寸 + 背景色)执行两步管线:自然美颜 → AI 重绘(换正装 + 纯色背景 + 规格裁剪)。无论原图穿什么衣服、戴不戴帽子,都通过 image-edit 一步重绘为标准正装证件照。
Dependencies
- meitu-cli (>=0.1.9):
npm install -g meitu-cli
- 凭证配置:
meitu config set-ak --value "..." + meitu config set-sk --value "..."
- 验证:
meitu auth verify --json
- oc-workspace.mjs(可选):
{OPENCLAW_HOME}/workspace/scripts/oc-workspace.mjs
路径别名: 下文中 $VISUAL = {OPENCLAW_HOME}/workspace/visual/,$OC_SCRIPT = {OPENCLAW_HOME}/workspace/scripts/oc-workspace.mjs
Core Workflow
Preflight → [Context: 跳过] → Execute (规格确认 → 两步管线) → Refine → Deliver → [Record]
Context 跳过原因: 证件照是标准化工具型管线(固定参数、官方规格),无创意自由度,不需要从 quality.yaml/global.md 加载审美偏好。
Preflight
meitu --version → 未安装则提示 npm install -g meitu-cli
meitu auth verify --json → 凭证无效则引导配置
node $OC_SCRIPT resolve → 获取 mode, visual, can_read_knowledge, can_record
脚本不存在 → 检查 cwd 有无 openclaw.yaml → 确定 mode;检查 $VISUAL 目录 → 确定 capabilities
can_record = cwd 有 openclaw.yaml AND $VISUAL 存在(两者缺一即 false)
- output_dir 解析(Preflight 内 MUST 完成):
node $OC_SCRIPT route-output --skill meitu-id-photo --name tmp --ext tmp
脚本不存在 → 3 级 fallback:
① cwd 有 openclaw.yaml → ./output/
② $VISUAL 存在 → $VISUAL/output/meitu-id-photo/
③ 均无 → ~/Downloads/
mkdir -p {output_dir}
硬约束: {output_dir} 禁止指向 skill 文件夹内部。output/ 永远在 skill 文件夹外部。
Execute 中所有 --download-dir {output_dir} 使用此处解析的路径。
Execute
需求分析
从用户输入中提取两个关键维度:
| 维度 | 如何确定 | 默认值 |
|---|
| 规格 | 用户指定名称(一寸、二寸、护照…)或具体尺寸 | 一寸(最常用) |
| 背景色 | 用户指定颜色名或 hex 值 | 白色 #FFFFFF |
规格匹配逻辑:
用户说"一寸照" → 匹配 一寸。用户说"护照照片" → 匹配 中国护照。用户说"美签照片" → 匹配 美国护照/签证。
用户说"蓝底二寸" → 规格=二寸,背景色=蓝色。
用户只说"证件照" → 问:需要什么规格?(列出常用选项:一寸/二寸/护照)
背景色快捷匹配:
| 用户表述 | 背景色 | Hex |
|---|
| 白底/白色/身份证/护照/签证 | 白色 | #FFFFFF |
| 蓝底/蓝色/毕业证/工作证 | 蓝色 | #438EDB |
| 红底/红色/结婚证/党员证 | 红色 | #FF0000 |
用户未指定背景色 → read references/spec-database.md § 中国标准尺寸 / 国际护照与签证,根据规格的"默认背景"列推断。推断不出则默认白色。
用户指定的规格未在上方快捷表中 → read references/spec-database.md 查找完整规格(含像素、默认背景、触发词)。
输入验证
- 必须有照片:未上传 → "请上传一张正面清晰的人物照片"
- 照片质量建议:正面、五官清晰、光线均匀。侧脸/遮挡严重会影响效果
- 帽子/墨镜:无需拒绝。
image-edit 会在重绘时自动去掉帽子和墨镜,生成免冠证件照
- 仅支持单人:beauty-enhance 限制单人。检测到多人 → 提示"证件照需要单人照片"
规格确认
向用户确认规格和背景色后再执行管线:
确认:一寸照(295×413px),白色背景
开始生成?
单一明确需求(如"帮我做一张蓝底二寸照") → 可跳过确认,直接执行。
两步管线
管线顺序是硬约束,不可调换:
Step 1: image-beauty-enhance 自然美颜(可选,用户说"不要美颜"则跳过)
Step 2: image-edit AI 重绘:换正装 + 纯色背景 + 构图裁剪(核心步骤)
链式调用机制: 中间步骤加 --json,解析返回 JSON 的 media_urls[0] 作为下一步的 --image 输入。最终步骤加 --download-dir {output_dir}(使用 Preflight 已解析的路径)。
Step 1(可选): 美颜 — image-beauty-enhance
meitu image-beauty-enhance --image {user_photo_url} --beatify_type 0 --json
--beatify_type 0:自然美颜(证件照硬约束,绝不使用 1)
- 效果:轻度磨皮去瑕疵、均匀肤色、微亮眼。保留皮肤纹理和真实面部结构
- 禁止操作:瘦脸、大眼、改变五官 — 证件照必须与本人一致
- 解析:
ok: true → media_urls[0] 传入下一步
ok: false → 跳过美颜,用原图继续(美颜失败不阻塞管线)
- 用户明确说"不要美颜" → 跳过此步
Step 2: AI 重绘 — image-edit(核心步骤)
image-edit 使用 praline 模型一步完成:换正装、去帽/墨镜、换背景色、构图裁剪。
meitu image-edit \
--image {input_url} \
--prompt "{prompt}" \
--model praline \
--ratio {ratio} \
--download-dir {output_dir}
Prompt 构建规则:
保持人物面部五官完全不变,免冠,{attire_desc},
纯{color_name}色背景({hex}),人物居中,正面直视镜头,表情自然端庄,
头部占画面约三分之二高度,头顶留适当空白,标准{spec_name}证件照风格
服装描述 {attire_desc} 选择:
| 场景 | attire_desc |
|---|
| 默认 / 未指定性别 | 穿着深色正装外套搭配白色有领衬衫,衣领整洁,肩部贴合自然 |
| 用户指定男士 | 穿着深蓝色西装外套搭配白色有领衬衫,系深色领带,衣领整洁 |
| 用户指定女士 | 穿着黑色职业西装外套搭配白色圆领衬衫,衣领整洁,肩部贴合自然 |
| 用户要求白衬衫(无外套) | 穿着白色有领衬衫,衣领整洁,无外套 |
| 用户自定义服装 | 按用户描述填写 |
关键原则: prompt 必须包含"保持人物面部五官完全不变"以确保人脸一致性。服装描述要具体(颜色+款式+细节),避免泛泛的"正装"一词。
变量替换示例(一寸白底,默认正装):
{attire_desc} = 穿着深色正装外套搭配白色有领衬衫,衣领整洁,肩部贴合自然
{color_name} = 白
{hex} = #FFFFFF
{spec_name} = 一寸
{ratio} = 3:4
完整 prompt 示例:
保持人物面部五官完全不变,免冠,穿着深色正装外套搭配白色有领衬衫,衣领整洁,肩部贴合自然,
纯白色背景(#FFFFFF),人物居中,正面直视镜头,表情自然端庄,
头部占画面约三分之二高度,头顶留适当空白,标准一寸证件照风格
--ratio 查表:read references/spec-database.md § --ratio 映射表 获取当前规格对应的 --ratio 值。
常用速查(完整表在 references):
| 常用规格 | --ratio |
|---|
| 一寸/二寸/大一寸/小二寸/中国护照/欧盟签证 | 3:4 |
| 大二寸 | 2:3 |
| 身份证/英国护照 | 4:5 |
| 美国护照/日本签证 | 1:1 |
Prompt 禁止语法(meitu-cli 使用纯自然语言):
- 禁止
--ar、--no、(keyword:1.5)、<lora:xxx>
- 比例通过
--ratio 参数传递,不写在 prompt 中
背景色精度说明:image-edit 是生成式模型,prompt 中的 hex 值为近似指导,实际出图颜色可能有偏差(如 #438EDB 可能偏天蓝)。对于需要像素级精准背景色的严格场景(如政府机构电子照片采集),应告知用户此限制,建议使用专业证件照软件做最终调色。
错误降级策略
每步独立处理,尽量不阻塞管线:
L1: 简化 prompt — 移除尺寸像素描述,只保留服装+背景色+居中指令
L2: 省略可选参数 — ratio 改为 auto
L3: 跳过美颜 — 美颜失败用原图继续
L4: 编辑失败 → 简化服装描述重试(只保留"穿着正装"),仍失败则交付原图并说明
L5: 首步即失败 → 检查凭证/余额,报错含 code + hint
特殊错误码:
ORDER_REQUIRED → 提示用户充值,提供 action_url
CREDENTIALS_MISSING → 提示配置 AK/SK
Refine
结果呈现:
- 展示生成的证件照
- 说明规格和背景色:"一寸白底证件照(295×413px)"
- 不暴露完整 prompt
反馈分类与处理:
| 反馈类型 | 调整方式 | 示例 |
|---|
| 背景色不对 | 修改 prompt 中的颜色值,重跑 Step 2 | "要蓝底不是白底" → 改 hex 重新编辑 |
| 尺寸不对 | 修改规格参数,重跑 Step 2 | "要二寸的" → 更换规格重新编辑 |
| 服装不满意 | 修改 attire_desc,重跑 Step 2 | "换白衬衫不要外套" → 调整服装描述 |
| 不像本人 | 在 prompt 中加强面部保留描述,重跑 Step 2 | "不太像我" → 强调面部不变 |
| 美颜过度/不够 | 跳过美颜或说明限制 | "不要美颜" → 跳过 Step 1 重跑 |
| 人物位置偏 | 调整 prompt 中的位置描述,重跑 Step 2 | "头太偏上了" → 修改构图指令 |
| 换张照片 | 从 Step 1 重新开始 | "用另一张" → 全管线重跑 |
| 满意 | 进入 Deliver | "可以" / "不错" |
迭代节奏:
- 每轮只调整用户反馈涉及的步骤,不重跑全管线
- 背景色/尺寸/服装调整只需重跑 Step 2(最快)
- 建议最多 3 轮迭代
- 超过 3 轮 → 建议换一张照片或调整期望
Deliver
output_dir 已在 Preflight 解析完毕,文件已由 --download-dir 下载到 {output_dir}。最终步骤返回 JSON 中 downloaded_files[0].saved_path 即为本地文件路径。Deliver 只做重命名:
node $OC_SCRIPT rename --file {downloaded_files[0].saved_path} --name {spec_name} → 规范文件名
脚本不存在 →
mv "{output_dir}/{task_id_filename}" "{output_dir}/$(date +%Y-%m-%d)_{spec_name}_{color_name}.{ext}"
{ext} 取自 downloaded_files[0].saved_path 的实际扩展名。
命名示例:2026-03-23_二寸_蓝底.jpg、2026-03-23_美国护照_白底.png
Record(项目模式 MUST / 一次性模式跳过)
前提: can_record = cwd 有 openclaw.yaml AND $VISUAL 存在(两者缺一即 false)。不满足 → 跳过全部记录,反馈仅当前对话有效。
No feedback → 完全跳过,不读 observations.yaml,零开销。
User approved style →
node $OC_SCRIPT read-observations → Agent 检查语义相似 key →
node $OC_SCRIPT write-observation --key "..." --scope-hint "..." --project "..."
→ promotion_ready: true(len(projects) >= 2)时,非阻塞提议(在回复末尾提及,不打断主流程):
"顺便说一下,你在 N 个项目中都偏好 X。要保存吗?
→ 保存到场景 [默认]
→ 保存到全局偏好
→ 不保存"
User confirms → write to $VISUAL/memory/scenes/{scope}.md 或 global.md,then delete-observation --key "..."
User ignores → do nothing
User rejected ("不要 XX") →
has openclaw.yaml → ask scope → project: DESIGN.md Constraints / universal: quality.yaml(需用户确认)
no openclaw.yaml → current task only, write nothing
Output
- 格式:取自实际下载文件(通常 JPG)
- 命名:
{YYYY-MM-DD}_{规格名}_{背景色}.{ext}
- 位置:由 Deliver 步骤决定
Boundaries
本 skill 只做证件照生成——标准化的美颜+AI重绘(换正装+背景+裁剪)。不做:
| 不做 | 转交 |
|---|
| 艺术写真 / AI 写真 / 风格照 | meitu-portrait |
| 通用修图 / 去水印 / 超清 | meitu-image-fix |
| 海报设计 / 排版 | meitu-poster |
| 创意换背景(非纯色) | meitu-portrait 或 meitu-image-fix |
边界判断:用户意图是"做一张标准证件照" → 本 skill。用户意图是"把照片背景换成风景" → 告知不是证件照场景,建议对应 skill。