免费

黑白棚拍

把获得授权的人物照片变成安静的黑白棚拍半身照,全程不重绘人脸。

安装

把“黑白棚拍”技能安装到 ~/.claude/skills/mono-portrait。
下载下面每个文件,保存到这个文件夹:
https://skilllift.pages.dev/packs/mono-portrait/SKILL.zh.md → SKILL.md
https://skilllift.pages.dev/packs/mono-portrait/references/style.md → references/style.md
https://skilllift.pages.dev/packs/mono-portrait/assets/look.json → assets/look.json
https://skilllift.pages.dev/packs/mono-portrait/scripts/mono-portrait.mjs → scripts/mono-portrait.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/vision.swift → scripts/vision.swift
https://skilllift.pages.dev/packs/mono-portrait/scripts/check.mjs → scripts/check.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/lib/png.mjs → scripts/lib/png.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/lib/jpeg.mjs → scripts/lib/jpeg.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/lib/img.mjs → scripts/lib/img.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/lib/refuse.mjs → scripts/lib/refuse.mjs
https://skilllift.pages.dev/packs/mono-portrait/scripts/lib/font.mjs → scripts/lib/font.mjs
然后读一遍 SKILL.md,告诉我它是做什么的,并提醒我开一个新会话。

解压到 ~/.claude/skills

同一个技能,不同的需求

左边是预览。右边由另一个 Agent 按不同需求制作,它只有安装好的技能,没看过预览。

预览
预览
新需求,由另一个 Agent 制作
新需求,由另一个 Agent 制作

这是按虚构需求做的一次测试。系统字体不同时,字形可能略有差异。

把一张获得授权的成年人照片变成安静的黑白棚拍半身照:柔和的单向光、自然的皮肤质感、细微的胶片颗粒和有意留出的空白,适合头像、个人主页和社交媒体。不使用生成式图像模型,也不重绘人脸,所以人还是原来的样子,眼镜也在。全部在用户自己的电脑上运行。当有人想用现有照片做黑白头像、棚拍风格肖像或个人资料照时使用。不要用于护照、证件或任何身份证明照片。

交付前必须通过

  • 我打开看过照片:只有一个人,看起来是成年人
  • 用户确认这是本人,或对方已同意
  • 不用于护照、证件、生物特征比对或身份证明
  • node scripts/check.mjs 对输出文件夹的退出码是 0
  • 每种裁切都按原尺寸和 96 像素看过,并如实判断;没有看到与检查结果相矛盾的问题
  • 如果照片上有徽记或名牌,已告诉用户这些仍然看得清,并建议换成自己的照片
  • 所有警告和提示都用平实的话告诉了用户
  • 告诉了用户:元数据已去除、没有上传任何内容、哪些东西改不了
  • 提醒了用户妥善保管检查图、JSON 和 qa/
阅读完整 SKILL.md
---
name: mono-portrait
description: 把一张获得授权的成年人照片变成安静的黑白棚拍半身照:柔和的单向光、自然的皮肤质感、细微的胶片颗粒和有意留出的空白,适合头像、个人主页和社交媒体。不使用生成式图像模型,也不重绘人脸,所以人还是原来的样子,眼镜也在。全部在用户自己的电脑上运行。当有人想用现有照片做黑白头像、棚拍风格肖像或个人资料照时使用。不要用于护照、证件或任何身份证明照片。
version: 1.0.0
---

# 黑白棚拍

这套效果写在 `assets/look.json` 和 `scripts/mono-portrait.mjs` 里。你要做的是:确认照片,确认下面的规则,运行一条命令,运行检查脚本,再亲眼看结果。不要手动修图。

**好处。** 这个技能有意不用生成式图像模型。Apple Vision 只在用户自己的 Mac 上找出人物轮廓以及眼睛和下巴的位置,不画任何东西。脸上的每个像素都来自用户自己的照片,只改变影调和光线,所以人还是本人的样子,眼镜和皱纹都原样保留。

**局限,要直接告诉用户。** 它改不了衣服、姿势和发型,去不掉衣服上的标志或徽章,也救不了一张差的照片。照片模糊、太暗或裁得太紧,结果就会差,或者直接被拒绝。衣服上的臂章、徽记和名牌仍然看得清,所以就算 `--label` 没写人名,名字也可能露出来。

## 规则

- 只能使用用户本人的照片,或者已经同意使用的人的照片。
- 拒绝护照、签证、身份证等任何证件照,拒绝生物特征比对,拒绝任何用来证明身份的用途。也不要提供变通办法。渲染脚本也会拒绝 `passport`、`id-photo`、`photo-id`、`proof-of-identity`、`护照` 这类标签,但这份词表不可能列全,默认标签也能通过。遇到这类请求,不管标签写什么,你都必须自己拦下。
- 工具无法核实对方是否同意。`--consent self` 和 `--consent permission` 只是记下你得到的说法,检查脚本也只确认这个词存在。你必须询问。如果只是用替代照片做测试,要说明这个值只是占位,照片里的人并没有同意。
- 如果是官方照片,上面有徽记、名牌或机构标志,要直接告诉用户:这些内容仍然看得清,相关机构可能限制使用,应该换成用户自己的照片。检查图底部也有同样的提示。
- 绝不改动五官和脸型,也不要把结果拿到别的工具里去改。
- 如果照片里不止一个人,或者人物看起来是未成年人,先停下来问用户。只有用户明确说明此人其实已经成年,才能继续,否则不处理这张照片。
- 要告诉用户:输出文件不含元数据,EXIF、GPS、相机信息和文字备注都不会保留。
- 不上传任何内容。渲染脚本不发起任何网络请求。你也不要把照片发到别处。

## 需要向用户询问的内容

需求里没有说明的,一次问清,放在同一条消息里。

1. 照片的文件路径。
2. 照片里是谁,对方是否同意。这一项决定 `--consent` 的值。

其他都不用问,所有字段都有安全的默认值。

## 字段

| 字段 | 含义 | 限制 | 需求信息不足时 |
|---|---|---|---|
| `--input` | 照片,可以是 JPEG、PNG、HEIC 或其他 macOS 能打开的格式 | 一个文件 | 询问用户,没有默认值 |
| `--out` | 输出文件夹,不存在时会自动创建 | 任何可写路径 | 用照片旁边的 `mono-portrait-out` |
| `--consent` | `self` 表示用户本人的照片,`permission` 表示对方已同意 | 只能是这两个词 | 询问用户,绝不能猜。如果没人能回答就停下,这是唯一不能猜的字段 |
| `--looked` | 你的声明:你已打开照片,看到一个看起来是成年人的人 | 只能是 `one-adult` | 先用看图工具打开照片。如果打不开,就询问用户 |
| `--label` | 文件名的开头部分 | 1 到 40 个小写字母、数字或连字符 | 用 `portrait`,它一定能通过检查。除非用户要求,不要用人名 |
| `--seed` | 颗粒图案。照片和种子都相同,结果就相同 | 0 到 999999 的整数 | 不填,默认是 1 |
| `--side` | 空白留在哪一侧 | `auto`、`left`、`right` | 保持 `auto`,它根据鼻子和眼睛的位置判断头部朝向,得分达到 0.06 才算明显转头。如果你看到人物明明朝向某一侧,结果却不对,就设为 `left` 或 `right` |
| `--backdrop` | 背景影调 | `auto`、`charcoal`(深炭灰)、`ash`(中灰) | 保持 `auto`。如果深色头发融进了背景,可以试 `ash` |
| `--confirmed-one-person` | Vision 数出不止一人但只找到一张脸时,用户确认画面里只有一个人 | 开关,不带值 | 必须先问用户。出现第二张脸时它不起作用 |

## 步骤

1. 打开照片看一眼。确认只有一个人、看起来是成年人、脸部清楚、头顶上方有空间。留意有没有东西贴着身体,比如手下面的桌子:画面会尽量在它上方结束。确认对方同意。
2. 渲染。大约需要 5 到 20 秒,第一次运行要编译 Vision 辅助程序,多约 3 秒:

   ```
   nice -n 10 node scripts/mono-portrait.mjs --input photo.jpg --out out --consent self --looked one-adult
   ```

3. 运行检查脚本,在技能文件夹或其他位置运行都可以。按提示解决问题,没通过的结果不要交付:

   ```
   node scripts/check.mjs out
   ```

4. 亲眼看结果。每张 PNG 都按原尺寸看一遍,再缩到 96 像素宽看一遍。老实问自己:这像棚拍,还是像加了滤镜的随手拍?注意有没有残留的旧背景碎片、生硬的切口、身体边缘的渐隐和发虚的脸。品味这件事,脚本判断不了。**你亲眼看到的优先于检查结果。** 如果原尺寸下能看到碎片、切口或参差的边缘,就算检查通过也按不合格处理,这张裁切不要交付。
5. 告诉用户你交付了什么,把每一条 `WARNING` 和 `NOTE` 用平实的话转述出来,并说明上面的局限。

## 其他系统

自动抠出人物需要 macOS Vision。在其他系统上,脚本会拒绝运行,也不会改动任何文件。请告诉用户,并提供第二种做法:由用户提供一张透明背景的人物 PNG,你自己从图上读出眼睛和下巴的位置:

```
node scripts/mono-portrait.mjs --cutout person.png --eyes x1,y1,x2,y2 --chin x,y --out out --consent self --looked one-adult
```

坐标是 PNG 里的像素位置:两个瞳孔的中心和下巴的最低点。这种做法无法自动判断人数,所以只能靠你亲眼确认。

## 脚本停止时

| 退出码 | 含义 | 怎么办 |
|---|---|---|
| 2 | 字段缺失或不合法 | 看提示,改命令 |
| 3 | 不止一个人 | 问用户要处理哪一位、对方是否同意,再把照片裁到只剩这个人。只有确实只有一个人、一张脸时,才用 `--confirmed-one-person` |
| 4 | 没有清楚的脸,或没有人物 | 请用户换一张更清楚、更正面的照片 |
| 5 | 系统没有 Vision,或辅助程序编译失败 | 提供透明 PNG 的做法,或运行 `xcode-select --install` |
| 6 | 照片太小或太暗。某个裁切需要放大超过 3.2 倍时会停止,大约相当于眼睛到下巴不足 125 像素。不足约 200 像素时会警告结果发虚 | 请用户换一张更好的照片。不要先放大或提亮来绕过检查 |
| 7 | 标签写明了证件或生物特征用途。这只是一份词表 | 拒绝 |

## 检查不通过时

| 问题 | 怎么办 |
|---|---|
| 头顶被裁掉 | 原图头顶没有空间,请用户换一张 |
| 残留旧背景碎片或有光晕 | Vision 分不开这种背景,请用户换一张背景更简单的照片。不要手动涂掉 |
| 空白不够 | 打开照片,看人物朝哪边,设为 `--side left` 或 `--side right`。两边都不行,就请用户换一张更宽的 |
| 身体上有生硬切口、碎片、参差或斑驳的边缘 | 原图里有东西被切掉,或者 Vision 分不开。请用户换一张身体没有贴着任何物体的照片 |
| 面部边缘或结构不一致 | 渲染之后有人改过文件。重新渲染,不要再编辑 |
| 暗部死黑、高光溢出或影调发平 | 问题出在原图,请用户换一张曝光更好的 |

## 第一张照片没通过时,按这个顺序试

1. 空白不够:重新运行,加 `--side left` 或 `--side right`,选人物面朝的一侧。
2. 深色头发或帽子融进了背景:重新运行,加 `--backdrop ash`。
3. 退出码 3,但确实只有一个人、一张脸:先问用户,再加 `--confirmed-one-person` 重新运行。
4. 其他问题:没有选项能解决,`--seed` 只会改变颗粒。请用户换一张:背后是素净的墙、头顶有空间、身体没有贴着物体、眼睛到下巴至少 200 像素。
5. 没有别的照片:什么都不交付,说明哪里没通过,以及什么样的照片可以通过。

如果没有更好的照片,也没人能回答,就不要交付没通过的结果。说明哪里没通过,以及什么样的照片可以通过。不要编造人物信息。用户没有提供的话,不要写说明文字、姓名或职位。

## 半身照

画面通常到胸口中部结束,不需要露出手。身体下部会渐渐融入背景。原图裁得近时,结果会是更近的头肩照,这也算半身照。如果用户想露出更多身体,要告诉对方。

## 交付内容

输出文件夹里有这些文件(`portrait` 代表 `--label` 的值):

- `portrait-1600x2000`、`portrait-1600x1600`、`portrait-2000x1125`,每种尺寸都有 `.png` 和高质量 `.jpg`。
- `portrait-qa-sheet.png`:原图和结果并排的检查图,底部附有徽记提示。
- `mono-portrait.json` 和 `qa/`:检查脚本需要的记录,包括原图副本、蒙版,以及用于构图的眼睛和下巴位置。

只有那六个图片文件可以发布。检查图、`mono-portrait.json` 和 `qa/` 里有原图和面部位置,要提醒用户妥善保管,确认结果后删除。如果用户想要其他尺寸,告诉对方这三种尺寸是固定的,可以自己从 PNG 裁切,但裁切后的图不在检查范围内。

## 交付前检查

- [ ] 我打开看过照片:只有一个人,看起来是成年人
- [ ] 用户确认这是本人,或对方已同意
- [ ] 不用于护照、证件、生物特征比对或身份证明
- [ ] `node scripts/check.mjs` 对输出文件夹的退出码是 0
- [ ] 每种裁切都按原尺寸和 96 像素看过,并如实判断;没有看到与检查结果相矛盾的问题
- [ ] 如果照片上有徽记或名牌,已告诉用户这些仍然看得清,并建议换成自己的照片
- [ ] 所有警告和提示都用平实的话告诉了用户
- [ ] 告诉了用户:元数据已去除、没有上传任何内容、哪些东西改不了
- [ ] 提醒了用户妥善保管检查图、JSON 和 `qa/`

## 不适用的情况

- 护照、签证、身份证、驾照等官方照片,或任何需要证明身份的照片。
- 合影、儿童照片,或未经本人同意的照片。
- 用户想换衣服、姿势或发型。这需要生成式图像模型,而这个技能没有。
- 用户想要彩色照片、真实场景或修过的脸。

## 运行要求

- 自动抠图需要 macOS 12 或更高版本。macOS 14 及以上,Vision 还能数人数;更早的版本只能数人脸,所以你亲眼确认更加重要。
- Xcode Command Line Tools,用来编译本地 Vision 辅助程序:`xcode-select --install`
- Node 18 或更高版本,不需要任何 npm 包:`brew install node`,或从 nodejs.org 下载安装包
- 不使用 Python、numpy、Pillow 和 Playwright,不使用生成式图像模型,也不需要联网。Apple Vision 在设备上运行。
- 渲染脚本只写入输出文件夹和系统临时文件夹。

用在这些流程里

相似技能