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>
7.5 KiB
name, description
| name | description |
|---|---|
| persona-icon | 產生或更新人格的形象圖(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. 找高解析度官方圖
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. 量測
node "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs" icon measure --session <PERSONA_SESSION> --photo "<圖片網址>"
會回報解析度、找到幾張臉、臉佔長邊多少、背景是透明/單色/有場景、去背難不難。
去背難度:偏難 就回第 2 步換一張設定稿,不要硬做。
4. 去背
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. 合成圖示
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. 沒有官方圖時:向量重繪(有臉)
裁出大頭照當底稿、親眼看過、讀出特徵,再重繪:
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 上
而且與本機一致;不一致會直接報錯。也可以手動查:
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 無亂碼。