# AI Id Photo Studio

> 生成中国标准证件照（一寸/二寸/驾照/结婚证等多规格，白底/蓝底/红底），支持换衣服、换发型、去水印、三档高清输出，以及成片的五官局部微调（鼻翼/鼻孔对称性等，保纹理不磨皮）。当用户需要制作证件照（驾驶证、护照签证、简历、考试报名、社保卡、结婚登记等）、要求给照片换背景或换衣服、提到"白底照片""一寸照""证件照""结婚证照片"、抱怨照片模糊/发型不好看/鼻子左右不对称需要优化，或要求只改某处五官且不要磨皮时使用。不适用于非中国证件照规格（如美国护照 2×2 英寸、申根签证尺寸）、纯艺术写真与创意换脸、以及要求美颜磨皮的场景。

- Skill: `koi-lee/ai-id-photo-studio` (Agent Skill, multi-file: 16 files)
- Install (CLI): `npx skillmds@latest add koi-lee/ai-id-photo-studio`
- Raw SKILL.md: https://api.skillmd.com/api/skills/koi-lee/ai-id-photo-studio/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: koi-lee (https://skillmd.com/u/koi-lee)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/koi-lee/ai-id-photo-studio

---


# AI 证件照工作室

## 双人照及连续修订

双人换装、换发型、肤质修订或历史成片归档前，读取 [双人修订与归档](references/couple-editing.md)。该流程用于私人风格预览，不承诺正式证件受理。已提供的选择不重复询问；局部满意不等于整图通过，用户最新否决优先于旧认可。

把用户的日常照片变成**合规、清晰、可交付**的证件照。核心是四步：**问清需求 → 生图重制 → 脚本后处理 → 交付验收**。

本技能只负责技术实现，**是否被办理机关受理由机关判定**，交付时要如实说明（见第六节合规提醒）。

## 不适用场景（先排除，避免误触发）

以下情况**不要**使用本技能 —— 直接告知用户超出范围，不要硬做：

- **非中国证件照规格**：美国护照 2×2 英寸、日本履历书用尺寸、其它国家签证专用尺寸等。
  规格表只覆盖中国常用规格，硬套会算错比例。
- **纯艺术写真 / 创意换脸 / 影视造型**：这类需求重在表现力，与"能被受理"的目标相反，
  按本技能的规格与合规标准做出来会偏死板。
- **要求美颜、磨皮、瘦脸、上妆**：本技能刻意不做（见铁律），政务系统普遍做人脸比对与
  合成检测，磨皮等于自毁。
- **只是问"我这照片能不能用"**：属于判断类问题，直接回答即可，不必走完整流程。

## 零、隐私声明（执行前必须告知用户）

- **人脸图片会被发送至用户所选用的第三方生图 API。** 动手前告知用户这一点。
- 若处理的是他人照片，请确认已取得授权。
- 生成的成片含生物识别特征，**不要上传到公开仓库或公开分享**。
- 只有走"本地液化"通道时图片不出本机 —— 这一点可以在对比通道时作为优势说明。

## 一、七条铁律（先读，都是踩过的坑）

1. **不要把 300dpi 档当成品交付。** 295×413 只有 12 万像素，屏幕一放大必糊，用户会立刻发现并投诉。默认输出**高清档**（一寸为 1181×1653，像素是前者的 16 倍）。只有用户明确说"报名系统要求 295×413"时才另存标准版。
2. **白 / 浅色上衣 + 白底 = 灾难。** 衣服和背景融为一体，人物像浮在半空。用户照片里凡是白色或浅色上衣，一律换成深色。完整冲突规则见 `wardrobe.md` 第一节。
3. **生图前必须确认需求，发型是必问项。** 不要拿到照片就直接生成 —— 用户对发型和服装的预期差异极大，返工成本远高于问一句。
4. **一批只发一个生图请求。** 并发提交会报错，并发开多个第三方会话会互相抢额度。**逐个串行**。
5. **覆盖用户已有成片前，必须先备份并逐字节校验。** 整套重制一律先出副本目录给用户看，确认后再备份 → 覆盖 → 校验。备份要校验和一致才算数，不能只看文件数。
6. **"只改某处五官且不要磨皮"绝不用生成式修图。** 生成式通道会整脸重绘（磨皮 + 瘦脸 + 提亮），目标部位几乎不变。必须走 §阶段 5 的本地液化法。
7. **源图不够大就不要硬撑"超清版"。** 低于目标宽度的放大是插值假细节，看着更糟。

## 二、工作流

### 阶段 0：交互式确认需求（不要跳过）

用平台提供的提问组件一次性给出选项（详见 `platform-host.md` 第二节），**不要让用户逐条回复**。

必问项：

| 问题 | 选项 |
|---|---|
| **发型**（核心开关） | 保持现有发型 / 换一款新发型 / 两种都要给我对比 |
| **规格** | 一寸（驾照、简历）/ 二寸 / 结婚证合影 / 其他（见 `specs.md`） |
| **底色** | 白底 / 蓝底 / 红底 |
| **服装** | 保持原衣服 / 换西装 / 换衬衫（选颜色）；浅色上衣需提示必须换深色 |
| **性别** | 决定服装库与发型库（见 `wardrobe.md` / `hairstyles.md`） |
| **用途** | 驾照 / 简历 / 签证 / 结婚登记等（影响风格建议与合规提醒） |

若用户选了"换发型"，再问款式 —— **一次不要列超过 5 款**，从 `hairstyles.md` 按脸型挑。

### 阶段 1：看照片、判脸型

打开用户提供的照片，判断：

- **脸型**：鹅蛋 / 圆 / 方 / 长 / 心形
- **当前发型问题**：扁塌？两侧推太光？刘海遮眉？
- **发际线与发量**：决定能否做露额造型

在回复里用一两句话说明判断依据，让用户知道你是有依据的，而不是随机出图。

> **关键洞察**：亚洲男性最常见的"发型扁塌不时尚"，根源往往不是脸型，而是**两侧推太光 + 顶部贴头皮**。推太光会形成强明暗对比，反而把"头顶不饱满"暴露得更明显。对策是两侧保留渐变（不铲平）＋顶部做蓬松纹理。

### 阶段 2：选通道、生图

**先选通道再动手。** 三条通道的取舍：

| 需求 | 通道 | 关键点 |
|---|---|---|
| 换底色 / 换服装 / 换发型 / 整体重制 | **第三方图生图 API**（推荐） | 质感自然、与底图一致度高、无水印；需额度。见 `platform-designkit.md` |
| 快速试一版 / 无 CLI 环境 | **宿主内置生图** | 开箱即用；输出带水印需后处理；分辨率上限约 1.5K，**出不了超清档**。见 `platform-host.md` |
| **只改某处五官、要求不磨皮** | **本地几何液化**（图片不出本机） | 见阶段 5 与 `liquify-geometry-retouch.md` |

> **同一批产出必须统一通道**，混用会让光影与质感不一致，用户一眼能看出来。

**prompt 四要素**（模板见 `prompts.md`）：

1. **面部特征锚定**（face_desc）：从原图逐项归纳脸型/眉/眼/鼻/唇/下颌等，逐条写进 prompt，防"被美化"
2. **保留真实五官关系**：不默认强制鼻翼、双眼绝对对称；只修用户指定且有依据的异常，保留自然不对称。
3. **核验实际分辨率**：使用通道支持的尺寸参数并检查输出像素；提示词写高分辨率不保证工具实现，像素增加也不等于真实细节恢复。
4. **服装 + 背景 + 证件照风格 + 输出比例**

**逐张生成，一张一张来。** 每张生成后立刻记下"文件 ↔ 款式"的对应关系，避免后面张冠李戴。

### 阶段 3：后处理（脚本）

```bash
<venv>/bin/python <skill-dir>/scripts/process_id_photo.py <刚生成的图> \
  --spec 1inch --outdir <输出目录> -n 一寸白底_黑色衬衫_经典正式
```

脚本一次完成：去右下角水印 → 按规格比例裁剪 → LANCZOS 缩放到高清档 → 自适应 USM 锐化 → 输出 JPEG。

- 批量处理时把目录路径作为第一个参数传入
- 源图本身没有水印时加 `--no-watermark`（第三方 API 的产出通常无水印）
- ⚠️ **三档必须输出到不同目录**。同名文件在同一目录会互相覆盖 —— `--std` 覆盖高清版是踩过的坑
- 处理完把中间产物清理掉（建议移入废纸篓而非直接删除）

**规格参数**：`--spec` 支持 `1inch`（默认）/ `2inch` / `marriage` 等，完整规格表见 `specs.md`。

### 阶段 4：交付与命名

命名格式：`<规格><底色>_<特征>_<风格>.jpg`

```
一寸白底_黑色衬衫_经典正式.jpg
一寸白底_微分碎盖_自然清爽.jpg
```

- **特征** = 服装（黑色衬衫）或发型（微分碎盖）
- **风格** = 场景气质，**不是颜色也不是发型**
- 用户指定了输出目录就存那里；没有就先问，不要擅自乱放
- 用平台的文件展示能力**一次性给出全部成片**，附款式说明与推荐用途

### 阶段 5：局部微调（用户对成片细节不满意时）

用户提出"鼻子/眼睛/嘴角不对称""某处高低不对"这类**只改一处、且要求不磨皮**的需求时：

**不要走生成式修图。** 走液化形变三步：

```bash
# ① 量 Δ（先量再修，不要凭感觉）
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --measure
# ② 出多档对比条，一次让用户指一个数字
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --ladder 2,4,6,8 --strip 对比条.png
# ③ 定稿并复测
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --auto --out 修正.png
```

- 一律用**画面坐标**（画面左 / 画面右）沟通。**用户主观方向与实测相反是常态** —— 先量再修
- 峰值位移 ≤ 实测 Δ 的 1.5 倍；一次给 4–5 档让用户挑，不要逐档来回问
- 修完再测一次，把前后 Δ 对比表交给用户（用户只认数据）
- 完整方法与边界见 `liquify-geometry-retouch.md`

## 三、画质验收

**第一条原则：文件体积 ≠ 清晰度。** 实测过 369 KB 的成片比 411 KB 的更锐。

用户说"不清晰"时的排查顺序：

```
① 客观测量（Laplacian 方差，统一缩放到同宽再比）
        ↓
② 查源图分辨率找根因（最常见：prompt 没写分辨率 → 源图只有 800×1120）
        ↓
③ 修根因（重生成高分辨率源），而不是盲目调大输出尺寸
```

测量方法、判读标准、质量检查清单、皮肤质感三档写法见 `quality.md`。

## 四、参考资源

| 文件 | 用途 |
|---|---|
| `references/specs.md` | **规格库**：八种尺寸 + 三底色色值 + 通用标准 + 三档输出标准 + 结婚证横版规格与合规提醒 |
| `references/wardrobe.md` | **服装库与着装冲突规则**：男女服装风格库、底衣色冲突表、命名约定 |
| `references/hairstyles.md` | **发型库**：男女发型（14 款）、脸型适配表、证件照发型红线 |
| `references/prompts.md` | **Prompt 模板库**：通用骨架、面部特征锚定（face_desc）、12 种发型写法、服装取值、参数建议 |
| `references/quality.md` | **画质与验收**：Laplacian 客观测量、根因排查、质量清单、皮肤质感三档、锐化参数 |
| `references/platform-designkit.md` | **通道 A**：第三方图生图 API（以美图设计室为例）四步调用链、分辨率控制、额度续跑、批量安全替换 |
| `references/platform-host.md` | **通道 B**：宿主内置生图参数、交互式提问与交付、技能安装位置、脚本运行环境 |
| `references/liquify-geometry-retouch.md` | **局部几何微调（液化法）**：不磨皮只改五官位置的完整闭环（量 → 试档 → 定稿） |
| `references/face-refinement.md` | 面部对称性精修：鼻翼不对称的成因与三种修正方案（含镜像法的坑） |
| `scripts/process_id_photo.py` | 后处理：去水印 → 裁剪 → 缩放 → 自适应锐化 → 高清输出 |
| `scripts/nose_liquify.py` | 鼻部几何微调：`--measure` 量差、`--ladder` 出对比条、`--auto` 定档 |
| `scripts/nose_symmetry_fix.py` | 基于人脸关键点的对称性修正 |
| `assets/face_landmarker.task` | 人脸关键点模型（MediaPipe Face Landmarker），供 `nose_symmetry_fix.py` 使用 |

## 五、依赖环境

脚本依赖 `pillow`、`opencv-python`、`numpy`（`nose_symmetry_fix.py` 另需 `mediapipe==0.10.35`）。

**必须装在隔离虚拟环境，不要全局 `pip install`** —— 全局安装会污染用户其它项目。

```bash
python3 -c "import PIL, cv2, numpy" 2>/dev/null && echo "依赖已就绪"
python3 -m venv ~/.venvs/idphoto
~/.venvs/idphoto/bin/pip install pillow opencv-python numpy
```

详见 `platform-host.md` 第五节。

## 六、合规提醒（交付时必须告知）

生成的证件照**能否被受理取决于办理机关**，本技能只负责技术实现，不保证过审：

- 政务系统通常要求**真实拍摄的原始影像**，部分系统会做人脸比对与合成检测。
- **不要过度美颜**（磨皮 + 瘦脸 + 提亮）。除了可能被判为"非原始影像"，实际办理时人脸比对也可能不通过。
- **结婚证合影**：登记规范要求双方"同一时间、同一地点共同拍摄"的合影，**不能是合成照片**。AI 生成的双人合影建议只用于预览风格或情侣写真；正式登记请实拍，AI 仅用于底色替换与轻度修饰。
- 请以当地办理机关的最新要求为准。

## 七、常见问题排查

| 现象 | 原因与对策 |
|---|---|
| 图看着糊 | 输出成了 300dpi 档。改用默认高清档；若源图本身只有 800×1120，需重生成高分辨率源（见 `quality.md` 第二节） |
| 用户说"不够清晰 / 文件才几百 K" | **先查源图分辨率，别急着改输出尺寸**。同时用 Laplacian 给客观数据 —— 体积 ≠ 清晰度 |
| 生图改了用户的五官 | 停止在失败图上叠代，回到真实参考或最近认可基准；提示词和保真度参数不能保证身份保真。见 `references/couple-editing.md` |
| 发型没变 / 发型被改了 | prompt 里漏了锁定发型的句子，或保真度参数过高（适当降低） |
| 白衣服配白底，人像浮空 | 换深色服装，见 `wardrobe.md` 第一节冲突规则 |
| 鼻翼 / 鼻孔左右不对称 | prompt 加 `symmetrical nose` 只能预防、不能修。已生成的图必须后处理（优先关键点液化，别用镜像融合），见 `face-refinement.md` 与 `liquify-geometry-retouch.md` |
| 修完鼻梁有竖痕 / 眼睛像重影 | 镜像融合的范围碰到鼻梁了，见 `face-refinement.md` 方案 C 的坑 |
| 用户要求"只改鼻子，不要磨皮" | 禁用生成式修图，改走液化形变，见阶段 5 |
| 修完用户说"没变化"或"方向反了" | 用户主观方向常与实测相反。先 `--measure` 拿 Δ 数值，再出对比条让用户挑档，统一用"画面左/右"口径 |
| 高清图变成糊图 / 只剩 295×413 | 标准版与高清版共用了同一输出目录被覆盖。重跑高清版并改到独立子目录 |
| 一批照片光影质感不一致 | 混用了两个生图通道。统一通道，缺的用断点续跑在原会话补齐 |
| 第三方 API 返回额度不足 | **不要重试、不要换会话重发、不要并发开会话**。拿返回的续跑命令让用户充值后执行，断点续传不重复扣费 |
| 水印没去掉 | 水印位置随图源变化，调整脚本里的水印区域比例参数 |
| 头发被裁掉 | 裁剪时下移量不够，调大裁剪偏移参数 |

