1. 找圖(icon search)
從 Fandom API 撈角色頁的所有圖片,依「解析度 + 是不是官方設定稿」排序。
官方設定稿(Full Body / Character Design / Avatar)是最好的來源:
* 773×1056 起跳,遠勝角色資料庫的 230px 縮圖
* **多半本來就是透明底 PNG**,去背幾乎免費、邊緣完美
新增 icon measure:回報解析度、臉佔比、背景是透明/單色/有場景、去背難度。
2. 去背(icon cutout)→ icon/portrait-cutout.png
三條路徑自動選:
source-alpha 原圖已是透明底(官方設定稿常見)→ 完美
plain-background 純白/單色底,色距去背 + 最大連通區 + 補洞 → 很好
grabcut 有場景時用臉的位置當前景種子 → 普通
實測記錄:把臉從 2026 主視覺裁下來再 GrabCut,結衣的黑髮會被整片當成背景切掉;
換成官方設定稿之後這問題直接消失——所以「找對圖」比「去背演算法」更關鍵。
3. 合成(icon generate --from-cutout)
自動裁成頭肩構圖再疊到角色配色的漸層底上。官方設定稿常是正反兩面並排,
不裁會變成兩個人,所以 compose 預設 --crop head(--zoom 可調鬆緊)。
產出 icon.svg(內嵌同一張 PNG,自成一體不外連)、icon.png,
以及 icon/portrait.svg 與 512/1024 兩個解析度。
向量重繪(--features)保留為「找不到可用官方圖」時的退路。
已更新兩個真實人格(皆為 cutout 樣式,Wiki 同步已驗證):
ASUNA-01 Asuna's SAO Avatar Full Body(773×1056,透明底)— 對應 2026
《Unanswered//butterfly》重述的早期艾恩葛朗特
YUI-01 Yui's ALO Pixie Form Full Body(773×1056,透明底)— 現行 Unital Ring
章的導航妖精形態
順手修掉兩個 bug:
* 合成路徑下 svg 為 null,回傳時 Buffer.byteLength(null) 直接崩潰。
* verifyArea 解析 git status --porcelain 時,因為 git() 會 trim 輸出,
開頭空白已消失(" M x" → "M x"),正規式對不上,檔名前面多一個 M。
selftest 175 項全綠(新增第 ⑲ 節:找圖評分、去背三路徑、compose 預設裁頭肩、
去背圖在 icon/ 會同步、SVG 不外連、沒有去背圖時 --from-cutout 會擋下)。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
143 lines
7.5 KiB
Markdown
143 lines
7.5 KiB
Markdown
---
|
||
name: persona-icon
|
||
description: 產生或更新人格的形象圖(icon.svg + icon.png):先找出該人格「最新一次登場」對應的**高解析度官方圖**(優先官方人設稿/設定圖,它們通常是透明底或白底、解析度遠高於資料庫縮圖),量測解析度與臉的大小後**去背**成透明 PNG,再裁成頭肩構圖、合成到取自角色配色的漸層底上,成為存取庫頭像並同步到 Gitea Wiki(含 icon/ 多解析度)。找不到可用的官方圖時,退回依人格資料重新繪製的向量人物形象。當使用者說要做人格頭像/形象圖/icon、要依角色最新造型更新圖示、說圖示不像或不夠清楚、或剛建立完人格要補圖示時觸發。不適用於:建立人格本身(persona-create/persona-anime)、同步到 Gitea(persona-sync)。
|
||
---
|
||
|
||
# 🎨 persona-icon — 依最新造型產生人格形象圖(有臉)
|
||
|
||
**CLI**:`node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"`(帶 `--session <PERSONA_SESSION>`)
|
||
**時機**:**人格建立且 IDENTITY/SOUL 補齊之後**——形象綁在最終身分上。
|
||
**目標**:圖示要是**人物形象圖,看得到臉**;退而求其次才是抽象徽章。
|
||
|
||
**流程**:找高解析度官方圖 → 量測 → **去背** → 裁頭肩 → 合成 → 更新頭像與 Wiki。
|
||
|
||
> 找不到可用的官方圖時(沒有設定稿、只有場景截圖且去背不乾淨),
|
||
> 才退回「依人格資料重新繪製」的向量形象(`--style portrait`)。
|
||
|
||
---
|
||
|
||
## 為什麼要上網找圖
|
||
|
||
圖示要像這個人格,就得用他**現在**的樣子:動漫角色會換造型、換作品、換髮色。
|
||
所以流程是「查最新登場 → 看那張圖 → 取色 → 畫」,而不是憑印象填色。
|
||
|
||
## 步驟
|
||
|
||
### 1. 查出「最新一次登場」
|
||
|
||
用 WebSearch 確認這個角色最近的官方動向(新作、新章節、新造型)與**對應的形態名稱**
|
||
(例:亞絲娜 → 2026《Unanswered//butterfly》重述早期艾恩葛朗特 → 對應 **SAO Avatar**;
|
||
結衣 → 現行 Unital Ring 章 → 對應 **ALO Pixie Form**)。
|
||
|
||
### 2. 找高解析度官方圖
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon search --session <PERSONA_SESSION> --wiki <fandom 子網域> --page <角色頁名>
|
||
```
|
||
|
||
結果依「解析度 + 是不是官方設定稿」排序,標 📐 的是設定稿(`Full Body`/`Character Design`/
|
||
`Avatar`)。**優先選設定稿**:
|
||
|
||
- 解析度高(常見 773×1056、1280×880),遠勝角色資料庫的 230px 縮圖
|
||
- **多半是透明底或純白底 → 去背幾乎免費、邊緣乾淨**
|
||
- 是官方繪製的正式立繪,不是動畫截圖
|
||
|
||
挑「與第 1 步的形態相符」的那一張——同一個角色會有很多套造型。
|
||
|
||
### 3. 量測
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon measure --session <PERSONA_SESSION> --photo "<圖片網址>"
|
||
```
|
||
|
||
會回報解析度、找到幾張臉、臉佔長邊多少、背景是**透明/單色/有場景**、去背難不難。
|
||
`去背難度:偏難` 就回第 2 步換一張設定稿,不要硬做。
|
||
|
||
### 4. 去背
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon cutout --session <PERSONA_SESSION> --photo "<圖片網址>" [--pick <索引>]
|
||
```
|
||
|
||
三條路徑,自動選最好的那條:
|
||
|
||
| 方式 | 什麼時候 | 品質 |
|
||
| --- | --- | --- |
|
||
| `source-alpha` | 原圖本來就是透明底(官方設定稿常見) | 完美 |
|
||
| `plain-background` | 純白/單色底 | 很好 |
|
||
| `grabcut` | 有場景,用臉的位置當前景種子 | 普通,邊緣可能不乾淨 |
|
||
|
||
輸出到 `icon/portrait-cutout.png`。**用 Read 打開確認**:邊緣有沒有殘留、頭髮有沒有被切掉。
|
||
黑髮角色在有場景的圖上特別容易被 GrabCut 誤切——真的不行就換設定稿。
|
||
|
||
### 5. 合成圖示
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon generate --session <PERSONA_SESSION> --force --from-cutout [--zoom 1.85] [--pick <索引>] \
|
||
--palette "hair=#..,eye=#..,accent=#..,secondary=#..,light=#..,skin=#.." \
|
||
--source-url "<那張圖的網址>" --source-note "<作品/形態+為什麼選這張>"
|
||
```
|
||
|
||
- 自動裁成**頭肩構圖**(官方設定稿常是正反兩面並排,不裁會變成兩個人;`--zoom` 調鬆緊)。
|
||
- 底色漸層取自 `--palette`(`light` → `accent`),所以要先看過圖再填顏色。
|
||
- 產出 `icon.svg`(內嵌同一張 PNG,自成一體不外連)、`icon.png`,以及
|
||
`icon/portrait.svg`、`icon/portrait-512.png`、`icon/portrait-1024.png`。
|
||
- **畫完用 Read 打開看一眼**,構圖不好就調 `--zoom` 或 `--face` 重來。
|
||
|
||
### 6. 沒有官方圖時:向量重繪(有臉)
|
||
|
||
裁出大頭照當底稿、親眼看過、讀出特徵,再重繪:
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon headshot --session <PERSONA_SESSION> --photo "<圖片網址>" --pick <索引> # 底稿,不同步
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon generate --session <PERSONA_SESSION> --force --palette "..." --features "hairstyle=..,eyes=..,expression=.."
|
||
```
|
||
|
||
特徵可選值:`hairstyle` straight/twintails/ponytail/bob/braid、`length` short/medium/long/very-long、
|
||
`fringe` blunt/parted/swept/curtain、`eyes` round/almond/sharp/droopy、
|
||
`expression` gentle/bright/calm/neutral、`accessory` none/ribbon/clip/flower/hairband、
|
||
`side` left/right、`collar` round/v/high/sailor、`ahoge` yes/no。
|
||
|
||
### 7. 回報
|
||
|
||
一句話說明:用了哪部作品哪一年的視覺、取到什麼配色、圖示放哪裡。
|
||
把來源網址附上,讓使用者可以自己核對。
|
||
|
||
## 三種樣式
|
||
|
||
| 樣式 | 什麼時候用 | 長什麼樣 |
|
||
| --- | --- | --- |
|
||
| `portrait` | 有底稿(有調色盤)→ **預設** | 依特徵重繪的人物頭像:髮型、瀏海、眼型、表情、髮飾、領口全部照特徵畫 |
|
||
| `badge` | 完全沒有參考圖(原創人格) | 雙色漸層徽章 + 編號前兩個字母 |
|
||
|
||
- 兩種樣式都由 Node 自己柵格化,SVG 與 PNG **共用同一份圖形清單**(橢圓/矩形/多邊形),
|
||
兩邊必然一致;PNG 是自寫的柵格器 + zlib 編碼,不依賴任何影像函式庫。
|
||
- 每次產生會輸出:`icon.svg`/`icon.png`(512,頭像用)+ `icon/portrait.svg`、
|
||
`icon/portrait-512.png`、`icon/portrait-1024.png`(高解析度),全部同步到 Wiki。
|
||
- SVG **不會內嵌任何影像**——沒有 `<image>`、沒有 base64、沒有外連。
|
||
- `badge` 樣式下若兩個顏色一深一淺(藍黑髮 + 淡粉洋裝),程式會把較亮的一端往較暗的壓,
|
||
確保字讀得到。
|
||
|
||
## 界線
|
||
|
||
- **找到的圖片只能當底稿**:裁出來的大頭照留在 `.sync/`,不進圖示、不同步、不發佈。
|
||
圖示的每個像素都是本工具依特徵畫出來的。
|
||
- 底稿的來源網址會記在 `config.json`,方便日後核對,但不重製原圖。
|
||
|
||
## Wiki 必須同步
|
||
|
||
`icon generate` 推完 Wiki 會**自動回頭驗證**,確認 `icon.svg` 與 `icon.png` 真的在 Wiki 上
|
||
而且與本機一致;不一致會直接報錯。也可以手動查:
|
||
|
||
```bash
|
||
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" sync verify --session <PERSONA_SESSION> --area wiki
|
||
```
|
||
|
||
## 邊界
|
||
|
||
- 只能對「本 session 已載入的人格」產生圖示。
|
||
- 已有圖示時要重畫必須加 `--force`。
|
||
- 不帶 `--palette` 重畫會**沿用 config 裡已存的配色**(不會突然變回雜湊色)。
|
||
- `.sync/reference.*` 與 `.sync/headshot.png` 是底稿快取,可以安全刪除(不會同步出去)。
|
||
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無亂碼。
|