# Image Outfit Swap

> AI 换装，保留人物面部和体型只替换衣物，支持文字描述或服装参考图。仅在用户明确要求对已有单人人物图片换装、试穿、换衣服或替换服饰，并已提供人物图片时触发。

- Skill: `meitu/image-outfit-swap` (Agent Skill)
- Install (CLI): `npx skillmds@latest add meitu/image-outfit-swap`
- Raw SKILL.md: https://api.skillmd.com/api/skills/meitu/image-outfit-swap/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: meitu (https://skillmd.com/u/meitu)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/meitu/image-outfit-swap

---


# Image Outfit Swap

## Overview

对已有人物图片做 AI 换装，保留人物面部 / 体型 / 形象只替换衣物，支持文字描述目标服装或上传服装参考图（人物图+服装图通过 image_list 传入）。简单颜色修改（如"把裙子改成红色"）也属于本工具。

执行前应让用户清楚知道：本 Skill 会读取 Meitu 凭证、调用本地 `meitu` CLI、将用户提供的人物图片、可选服装参考图与换装描述发送到 Meitu OpenAPI 处理，并把结果写入 `./output/` 或 `$VISUAL/output/image-outfit-swap/`。涉及人像照片时，应确认对照片中人物具备处理授权。

## API Mapping

- 换装主路径、轻量降级和兜底路径由 `image-outfit-swap` 路由内部处理。

## Dependencies

- **meitu-cli**: `>=2.0.6`
- **凭证**：CONFIG AKSK → `meitu tools update`；EXEC AKSK → 实际执行（见根 `CONFIG.md`）
- **环境变量**：`MEITU_OPENAPI_TOOL_TASK_MODE=command`

> 路径别名：`$VISUAL` = `{OPENCLAW_HOME}/workspace/visual/`

## Core Workflow

```
Preflight → Execute → Deliver
```

### Preflight

1. `meitu --version` ≥ 2.0.6
2. 已用 CONFIG AKSK 跑过 `meitu tools update`
3. 当前 AKSK = EXEC，`MEITU_OPENAPI_TOOL_TASK_MODE=command`
4. output_dir：openclaw.yaml → `./output/` ｜else → `$VISUAL/output/image-outfit-swap/`；`mkdir -p {output_dir}`

### Execute

**触发信号 / 路由规则**

| 场景 | 判定条件 | 路由 |
|------|----------|------|
| 换装 / 换衣服 | 换装、换衣服、试穿、穿上、改成 xxx 服装 | 换装主路径 → 轻量路径 → 兜底路径 |
| 虚拟试穿（有服装图） | 用户上传了 clothes_image_url | 换装主路径（人物图与服装图共同输入） |
| 简单颜色修改（衣服） | 把裙子改成红色 | 换装主路径 |

**参数定义**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `image_url` | STRING | 是 | 人物图片地址。缺失 → 提示"请提供需要换装的人物图片" |
| `prompt` | STRING | 是 | 目标服装描述。缺失 → 提示"请描述目标服装款式" |
| `clothes_image_url` | STRING | 否 | 服装参考图地址。提供时与 image_url 一起传入换装主路径 |

API 映射说明：

- 换装主路径：`prompt` 自动扩写为英文换装指令（如 `"Change the person's outfit to a white linen shirt, keep face and body unchanged"`）。
- 降级与兜底路径：`prompt` 直传。

**工具调用**

```bash
meitu image-outfit-swap --image_url <person> --prompt "<target outfit>" --json --download-dir {output_dir} --skill_name skill_image-outfit-swap
```

```bash
# 带服装参考图
meitu image-outfit-swap --image_url <person> --clothes_image_url <clothes> --prompt "<target outfit>" --json --download-dir {output_dir} --skill_name skill_image-outfit-swap
```

**错误降级**

| 场景 | 处理方式 |
|------|------|
| `image_url` 缺失 | 提示"请提供需要换装的人物图片"，不调用 API |
| `image_url` 不可访问 | 直接返回图片链接无效错误，不重试 |
| `prompt` 缺失 | 提示"请描述目标服装款式" |
| `prompt` 过于模糊 | 提示细化描述（款式 / 颜色 / 材质 / 风格） |
| 图片无明显人物 | 返回错误，提示需包含清晰人物 |
| 换装主路径调用失败 | 自动降级至轻量路径 |
| 换装轻量路径调用失败 | 自动降级至兜底路径 |
| 换装兜底路径调用失败 | 返回错误 |
| 内容合规拦截 | 直接返回合规提示，不重试、不降级 |

### Deliver

- 使用 Preflight 解析的 output_dir
- 从 `downloaded_files[0].saved_path` 读取已下载文件路径
- `mv {downloaded_files[0].saved_path} {output_dir}/{YYYY-MM-DD}_{descriptive}_image-outfit-swap.{ext}`

## Output

- **格式**：image（PNG/JPG 由 API 决定）
- **位置**：项目 → `./output/`，一次性 → `$VISUAL/output/image-outfit-swap/`

## 基线 Task ID

见 `references/task-id-baseline.md` 中对应行。

