# Halftone Pop

> 半调拼贴海报专业 Prompt 生成器。三步走——① 分析原图（吸主色/选强调色/读主体类型/判断对比度高低/读拼贴元素）② 按对比度分路线生成 prompt（高对比→锋利 90 年代杂志风 / 低对比→柔和 ins 文艺风）③ 按固定格式输出。共同规则：60-30-10 配色、装饰取自原图、细实线方框 1-3 个圈局部特写、大标题粗体大写英文放左上或右上、小标签放右下、留白充足、网点 45 度斜角。当用户要求 半调海报、半调风格、网点海报、halftone、波普海报、pop art、丝网印刷风、网版印刷、杂志拼贴海报、scrapbook collage、zine、90年代拼贴、复古拼贴、Y2K 海报、孔版印刷人物海报、爱豆周边，或发来照片说"以这张为参考""重新生成一张""也做成这种效果"时触发。默认同时产出结构化 prompt 与生成图。

- Skill: `caojingzhi1015-bit/halftone-pop` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add caojingzhi1015-bit/halftone-pop`
- Raw SKILL.md: https://api.skillmd.com/api/skills/caojingzhi1015-bit/halftone-pop/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: caojingzhi1015-bit (https://skillmd.com/u/caojingzhi1015-bit)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/caojingzhi1015-bit/halftone-pop

---


# 半调拼贴海报 Prompt 生成器（路线版）

把任意一张参考图变成一段**可直接投喂绘图模型的中文 prompt**，并默认生成对应的海报图。

风格内核：**单色半调网点 + 丝网印刷 + 杂志拼贴**。
分两条路线：**高对比 → 锋利（90 年代杂志拼贴）**／**低对比 → 柔和（ins 文艺莫兰迪）**。

## 触发场景

- "帮我做一张半调海报 / 网点海报 / 波普海报 / 杂志拼贴海报"
- "丝网印刷风 / 网版印刷 / halftone / pop art / zine / scrapbook collage / 孔版印刷人物海报"
- 用户发来照片 + "以这张为参考" / "重新生成" / "也做成这种效果"

## 默认交付物

1. 一段**分析摘要 + 结构化中文 prompt**（严格按第三步的格式，不增删字段）；
2. 一张**生成的海报图**；
3. 可选：一行配色配方（主色 / 强调色 hex）。

保存到 `~/Desktop/Claude skills/halftone-pop/`（不存在则创建；无写权限时仅在对话中输出）。

仅当用户明确说"只要 prompt"或环境无绘图能力时，才停在 prompt-only。

---

## 第一步：分析原图

依次做五件事：

1. **【吸色】主色** —— 原图**最深、面积最大**的颜色（半调主体用），中文描述 + 近似色名 + hex。
2. **【选强调色】2-3 个** —— 原图里**最活泼、跳脱**的颜色（装饰 / 方框 / 标题用），中文色名。
   宁少勿多。
3. **【读内容】主体类型** —— 人像 / 产品 / 团体照 / 抽象图形 / 风景…
4. **【判断对比度】高还是低** —— **必须程序量化，不要凭感觉**：

   | 指标 | 高对比 | 低对比 |
   |---|---|---|
   | 灰度标准差 std | > 55 | < 45 |
   | P95 − P5 动态范围 | > 150 | < 120 |
   | 暗部(<60)占比 | 高 | 低 |
   | 亮部(>200)占比 | 高 | 低 |

   满足 2 条以上即定性：**高对比 → 路线 A 锋利**；否则 **路线 B 柔和**。
5. **【读风格】拼贴元素** —— 原图有没有方框特写、大标题、小标签、胶片小图、涂鸦、条码…

### 取色 / 对比度脚本

```bash
python scripts/extract_colors.py "图片路径"   # 主色、暗部主色、有彩度暗色、点缀色（含 hex 与占比）
```

对比度可用几行 OpenCV 自算：`gray.std()`、`np.percentile(gray,[5,95])`、`(g<60).mean()`、`(g>200).mean()`。

### 边界情况

- **原图无彩色（纯黑白 / 单色照）**：饱和度均值≈0，没有"活泼强调色"可提取。
  不要硬编荧光色，也不要说无法完成 —— **明确说明**，然后按路线**派生**低饱和强调色：
  - 路线 A：1-2 个跳脱但压得住的颜色（砖红、钴蓝、芥黄…），占 5-10%；
  - 路线 B：2-3 个邻近莫兰迪色，占 15-20%。
- **原图没有拼贴元素**：拼贴是本风格的固有语汇，可**新写**大标题 / 小标签，
  内容必须与主体相关（团体名、日期、期号、GUEST STAR…），总量克制。

---

## 第二步：按路线生成 Prompt

### 路线 A：高对比 → 锋利风格

适用：对比度高、色彩浓烈、人像/团体照偏硬照感。

- 半调主色：**高对比黑白**（或原图主色），**明暗差距拉满**——暗部纯、亮部白。
- 网点：**锐利清晰，边缘无毛刺**，有力量感。
- 强调色：1-2 个跳脱色，占画面 **5%-10%**，只用在**标题 / 方框 / 极小点缀**。
- 装饰极简：**方框强调 + 大标题 + 小标签**，不加花花草草。
- 气质：**锋利、杂志感、90 年代拼贴风**。

### 路线 B：低对比 → 柔和风格

适用：灰调柔和、莫兰迪感、相近色搭配、偏文艺/治愈。

- 半调主色：**低饱和莫兰迪色调**，明暗过渡柔和。
- 网点：**细腻均匀**，柔和过渡。
- 强调色：2-3 个**邻近色**，占画面 **15%-20%**，可多些装饰。
- 装饰：方框 + 大标题 + 小标签 + 少量装饰元素（花/星星/圆点），**不超过 5 个**。
- 气质：**温柔、文艺、ins 风、治愈系**。

### 两条路线共同规则

- 配色遵循 **60-30-10 法则**。
- 装饰元素**从原图识别出的元素里选**，不凭空加。
- **细实线方框**圈出局部特写，**1-3 个**，紧贴局部边缘，利落干脆。
- **大标题**：粗体大写英文，放**左上角或右上角**，占画面宽度约三分之一。
- **小标签**：放**右下角**，小号字体，不抢主体。
- **留白充足**，不塞满。
- **背景三选一**：A 纯白 / B 浅灰渐变（上深下浅）/ C 淡色半调渐变。
- **网点 45 度斜角排列**，有老式胶印颗粒感。

---

## 第三步：输出格式

```
┌─ 提取结果 ──────────────
│ 主色：{颜色}
│ 强调色：{颜色1}、{颜色2}、{颜色3}
│ 主体类型：{类型}
│ 对比度判断：{高对比 → 锋利路线 / 低对比 → 柔和路线}
│ 拼贴元素：{方框/大标题/小标签/胶片小图 等}
└──────────────────────────
完整 Prompt：
{主体描述}，{景别/角度}，半调拼贴海报风格。
半调网点效果，单色丝网印刷风格。整张画面用{主色}的均匀圆形网点呈现主体，{路线A：明暗对比强烈，暗部纯黑亮部纯白，边缘锐利无毛刺 / 路线B：明暗过渡柔和，细腻均匀，有灰调层次}。网点为45度斜角排列，{路线A：有老式胶印的锋利颗粒质感 / 路线B：有细腻柔和的印刷颗粒感}。
{配色描述：}
路线A：仅使用从原图提取的{强调色1}、{强调色2}作为强调色，占画面约5%至10%，仅出现在标题、方框和极小面积点缀上，其余全部为{主色}。
路线B：使用从原图提取的{强调色1}、{强调色2}、{强调色3}作为点缀色，占画面约15%至20%，分布在装饰元素上。所有颜色为低饱和莫兰迪色调，柔和统一。
画面左上角放置粗体大写英文标题，内容为{与主体相关的英文短语}，字体为{粗衬线/粗黑体}，颜色为{强调色}，占画面宽度约三分之一。
用{强调色}细实线方框圈出1至3处局部特写（如眼睛、手部、产品细节），方框紧贴局部边缘，利落干脆。
画面右下角放置小标签文字，内容为{日期/编号/小字说明}，小号字体，不抢主体。
{背景，三选一：}
A. 纯白背景，干净利落
B. 浅灰渐变背景，从上到下由深到浅过渡，有空间感
C. 淡色半调渐变背景，柔和过渡，不抢主体
{路线专属补充：}
路线A：周围可散布极小面积的{强调色}小星星/小方块点缀，稀疏分布，不超过5个。
路线B：周围可散布少量装饰元素（从原图识别出的类型选2至3种），大小错落，分布稀疏透气。
四周保留充足留白，画面平衡不呆板。{画幅比例}。
{路线A：锋利半调印刷感，90年代杂志拼贴风格，高对比，高分辨率，网点清晰锐利 / 路线B：柔和半调印刷感，ins文艺风格，低饱和莫兰迪，高分辨率，适合印刷输出}。
```

字段填写规则：

- `{景别/角度}`：团体照写"一字排开的全身群像，正面平视"；单人写"半身胸像，正面微侧，平视角度"。
- `{画幅比例}`：默认沿用**原图比例**（横图 `3:2 横版`，竖图 `3:4 竖版`）。
- 大标题内容取与主体相关的**英文短语**（团体名 / 歌名 / 期号名）；中文标题会破坏印刷感。
- 小标签写日期 / 编号 / 期号一类短字，如 `2026.03.26`、`NO.11`、`GUEST STAR`。

> ⚠️ 小标签放**右下角 = 平台水印区**。出图后清完水印要**原样重绘**标签，不要让它跟着水印一起消失（见下节）。

---

## 去除平台水印（出图后处理）

绘图服务会在成品**右下角**盖上「AI生成 WORKBUDDY」水印。若需要干净版：

```bash
python scripts/remove_watermark.py "<成品图路径>"          # 通用：同列上方错位取补丁
```

若水印**压在自有小标签（编号/日期）上**，用带重绘的版本：

```bash
python scripts/remove_watermark_relabel.py "<输入图>" "<输出图>" \
    --text "NO.11 / 2026 03.26"
```

它会：连通域定位标签 → 覆盖水印区 → 用同款字体**原样重绘**标签。

**水印跨「明暗交界」（一侧黑一侧浅底）时**，上面两种整块替换都会毁掉一侧，改用分区重建：

```bash
python scripts/remove_watermark_zones.py "<输入图>" "<输出图>" \
    --zone 872,1014,1448,1536 --text "2026 / NO.03" --label-box 835,980,1470,1491
```

分区规则：局部均值（`blur 31`）低于阈值判为暗区 → 用该区**中值色 + 轻噪声**重建
（纯黑衣物等无细节区，视觉无损）；亮区若水印仍可见 → 做白色叠加的**物理反演**。

### 硬规则（都是踩过坑的）

- **不要**用云端 erase / 智能擦除类工具 —— 实测会把标题或主体一起抹掉。
- **纹理补丁优先取「同一 y 行、左侧紧邻」的区域**：半调网点的点径随纵向渐变变化，
  取上方区域会让补丁网点尺度不同，留下明显方块边界（横向则尺度天然一致）。
- 判断"源区是否干净"**不能按单像素灰度**（网点本身就是深色像素），
  要先大尺度模糊（21×21）再看有没有成片暗块。
- **坐标必须程序检测**，凭放大截图目测会偏。定位标签用**连通域面积过滤**（面积 ≥25）排除网点噪点；
  水印是**白色半透明**，压在深色区时不能用"深色像素"阈值。
- ROI 必须**外扩到图像右边界与下边界**，否则尾部字母残留。
- 竖版 (1024×1536) 水印 bbox ≈ x 900–1015、y 1472–1526；
  横版 (1536×1024) bbox ≈ x 1385–1520、y 940–1010。
- 重绘标签的字号：**先按目标墨迹高度定号，再把字形水平缩放到目标宽度**
  （原字体通常比 Arial Bold 窄），并以 ~0.96 不透明度 + ±4 高斯噪声混入，保留印刷颗粒感。
- 水印若与原图自带徽标 / Logo 叠在一起，两者都属于第三方标识，可一并清除。
- **判明暗分区不能用 erode/dilate**：网点区里 `erode` 会取到网点暗点、`dilate` 会取到网点白缝，
  两种都会判错。用 `cv2.blur(gray, (31,31))` 的局部均值 + **连通域过滤 + 向内收缩 13px**
  （收缩是为了避开黑白交界的混合带，否则交界处会留下一条暗带）。
- **白色水印是物理叠加**：`obs = (1-a)·orig + a·255`。测出 `a` 后可逐像素反演
  `orig = (obs - 255a)/(1-a)`，能**完整还原纹理**（比 inpaint/补丁更准）。
  `a` 用「笔画内中值 vs 其外环中值」直接估计，实测暗区 ≈0.72、浅底 ≈0.40。
- **掩膜别把自家标签一起圈进去**：自有彩色标签用**饱和度**排除（`S > 55`）。
- inpaint（TELEA）在**大面积掩膜**上会失败（从同样被污染的邻居插值 → 填出亮块），
  只适合细笔画；面积大就走分区重建。


## 质量校验（出图后自检）

1. 是否**只有主色一种网点**表现主体？有无多色网点 / 荧光色？
2. 网点是否 **45 度斜角**、圆润均匀？路线 A 是否**锐利无毛刺**、明暗是否拉满？
3. 配色是否 **60-30-10**？路线 A 强调色是否在 **5-10%**、只出现在标题/方框/极小点缀？
4. **方框是否 1-3 个**、细实线、紧贴局部？**大标题**是否在左上/右上、约占 1/3 宽？
   **小标签**是否在右下且不抢主体？
5. 装饰是否**全部来自原图元素库**？路线 A 装饰是否**极简**？
6. 主体是否可辨认？**留白是否充足**、有没有塞满？

任一项不达标，调整 prompt 重生成一次；仍不达标则说明偏差，不假装达标。

## 输出格式

````markdown
**提取结果**

- 主色：{颜色}
- 强调色：{颜色1}、{颜色2}、{颜色3}
- 主体类型：{类型}
- 对比度判断：{…}（附 std / 动态范围数值）
- 拼贴元素：{方框 / 大标题 / 小标签 / 胶片小图}

**完整 Prompt**

```text
[按第三步结构产出的完整 prompt]
```

**生成图**

![halftone-pop poster](absolute-image-path)

**本次配色**

- 主色: {hex}　强调色: {hex × 2-3}
- 画幅: {ratio}
````

## 触发示例

- "用 halftone-pop 把这张照片做成半调拼贴海报。"
- "以这张为参考，重新生成一张。"
- "这张图是高对比还是低对比？给我对应的 prompt。"

