Files
jiantw83andClaude Opus 5 929ccb3c05 feat: 從找圖開始優化——高解析度官方設定稿 → 去背 → 合成為形象圖
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>
2026-07-30 03:43:45 +00:00

7.5 KiB
Raw Permalink Blame History

name, description
name description
persona-icon 產生或更新人格的形象圖(icon.svg + icon.png):先找出該人格「最新一次登場」對應的**高解析度官方圖**(優先官方人設稿/設定圖,它們通常是透明底或白底、解析度遠高於資料庫縮圖),量測解析度與臉的大小後**去背**成透明 PNG,再裁成頭肩構圖、合成到取自角色配色的漸層底上,成為存取庫頭像並同步到 Gitea Wiki(含 icon/ 多解析度)。找不到可用的官方圖時,退回依人格資料重新繪製的向量人物形象。當使用者說要做人格頭像/形象圖/icon、要依角色最新造型更新圖示、說圖示不像或不夠清楚、或剛建立完人格要補圖示時觸發。不適用於:建立人格本身(persona-createpersona-anime)、同步到 Giteapersona-sync)。

🎨 persona-icon — 依最新造型產生人格形象圖(有臉)

CLInode "${CLAUDE_PLUGIN_ROOT}/scripts/persona.mjs"(帶 --session <PERSONA_SESSION> 時機人格建立且 IDENTITYSOUL 補齊之後——形象綁在最終身分上。 目標:圖示要是人物形象圖,看得到臉;退而求其次才是抽象徽章。

流程:找高解析度官方圖 → 量測 → 去背 → 裁頭肩 → 合成 → 更新頭像與 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 BodyCharacter 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 調鬆緊)。
  • 底色漸層取自 --palettelightaccent),所以要先看過圖再填顏色。
  • 產出 icon.svg(內嵌同一張 PNG,自成一體不外連)、icon.png,以及 icon/portrait.svgicon/portrait-512.pngicon/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.svgicon.png512,頭像用)+ icon/portrait.svgicon/portrait-512.pngicon/portrait-1024.png(高解析度),全部同步到 Wiki。
  • SVG 不會內嵌任何影像——沒有 <image>、沒有 base64、沒有外連。
  • badge 樣式下若兩個顏色一深一淺(藍黑髮 + 淡粉洋裝),程式會把較亮的一端往較暗的壓, 確保字讀得到。

界線

  • 找到的圖片只能當底稿:裁出來的大頭照留在 .sync/,不進圖示、不同步、不發佈。 圖示的每個像素都是本工具依特徵畫出來的。
  • 底稿的來源網址會記在 config.json,方便日後核對,但不重製原圖。

Wiki 必須同步

icon generate 推完 Wiki 會自動回頭驗證,確認 icon.svgicon.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 無亂碼。