之前在「為什麼我做了一個台灣版大富翁」一文裡提過,台灣富翁的 28 塊地產各有專屬的像素風小插圖(101 是大樓剪影、九份是階梯、阿里山是火車)。每張不到 500 bytes,但給玩家很強的記憶點。這篇把當時用 AI 生圖工具完成這 28 張小圖的完整流程拆開講 — prompt 怎麼寫、後處理怎麼做、為什麼最後選擇像素風而不是寫實風。
為什麼用 AI 生圖而不是手繪
獨立工作室最稀缺的是「美術時間」。28 張地產插圖,如果發包給插畫師,依台灣行情大約每張 800–2000 元,總價 2–6 萬,外加 1–2 週的溝通與修改週期。我用 AI 生圖工具把這個成本壓到:
- 時間:3 小時(含 prompt 試錯、批次生成、後處理)
- 金錢:約 NT$0(用免費 quota 內的 Stable Diffusion 本地版本)
- 修改成本:改個 prompt 重新生即可,不用發 Slack 等回覆
代價是「藝術指導」全壓在自己身上 — AI 不會自己思考視覺風格的一致性,需要人去把關。但對「批量產低密度的素材」場景,這個 trade-off 完全值得。
選擇像素風的原因
一開始試過寫實風(「a photo of Taipei 101 at sunset」),結果發現幾個致命問題:
- 細節太多:1080p 寫實圖塞進 64×64 棋盤格根本看不清楚。
- 風格漂移:28 張寫實圖很難維持「同一個世界觀」,光線、顏色、構圖各自為政。
- 檔案太大:每張 200–500KB,28 張就 10MB+,瀏覽器遊戲不能容忍。
切換到像素風(pixel art)之後一次解決三個問題:
- 低解析度(32×32 或 64×64)天然適合棋盤格
- 像素風的「美學限制」反而讓 28 張更容易維持一致性 — 都被縮在同一個調色盤與網格裡
- 每張壓成 PNG-8 大約 200–500 bytes,全部 28 張不到 15KB
Prompt 工程實戰
初版 prompt(失敗範例):
"pixel art of Taipei 101 building"
產出來的是寫實感很重的「pixel art 風格但本質還是寫實」的圖。需要更明確的限制:
"16-bit pixel art, Taipei 101 skyscraper silhouette, night sky, neon city lights, 32x32 sprite, limited 8-color palette, NES-style, clean outlines, no anti-aliasing, no gradients, solid color blocks, retro game asset --ar 1:1"
關鍵詞解析:
| 關鍵詞 | 作用 |
|---|---|
| 16-bit / NES-style | 把 AI 鎖到 SNES / NES 時代的美學 |
| limited 8-color palette | 強制有限調色盤,避免漸層 |
| 32x32 sprite | 明確的解析度暗示 |
| no anti-aliasing | 銳利邊緣,避免模糊 |
| solid color blocks | 避免複雜紋理 |
| silhouette | 強調剪影,符合縮圖辨識度 |
批次生成的 prompt 模板
28 張地產要保持風格一致,最重要的是「prompt 模板」固定,只變動「主體描述」。我用的模板:
STYLE_PREFIX = "16-bit pixel art, [SUBJECT], [SETTING],
limited 8-color palette, retro NES-style,
no anti-aliasing, solid color blocks, 32x32 sprite,
clean outlines, blue-purple-pink color scheme"
# 28 個地點各自填 [SUBJECT] 與 [SETTING]:
台北101: SUBJECT="Taipei 101 skyscraper silhouette",
SETTING="night sky with neon city lights below"
九份: SUBJECT="winding stone steps with red lanterns",
SETTING="mountainside village at dusk"
阿里山: SUBJECT="vintage steam train on a single track",
SETTING="forested mountain pass with mist"
...
共用的 STYLE_PREFIX 確保 28 張看起來像「同一個畫家畫的」。實務上每個 SUBJECT 我會生 4 張變體(同 prompt 不同 seed),挑最好的一張,平均 1 個地點花 4 分鐘。
後處理(Post-processing)
AI 生出來的圖通常有幾個問題要修:
1. 解析度不準
就算寫了「32×32 sprite」,AI 生圖工具吐出來通常還是 1024×1024 或 512×512。需要用 nearest neighbor 演算法縮到 64×64 或 32×32。我用 Python + Pillow 批次處理:
from PIL import Image
import os
for fname in os.listdir('raw/'):
img = Image.open(f'raw/{fname}')
# 先用 box filter 壓到 128,保留結構
img = img.resize((128, 128), Image.BOX)
# 再用 nearest neighbor 壓到 32,保銳利
img = img.resize((32, 32), Image.NEAREST)
img.save(f'processed/{fname}', optimize=True)
2. 調色盤漂移
「8-color palette」常常被 AI 解讀成「以 8 色為主」但實際上有 200+ 色。需要強制 quantize:
img = img.quantize(colors=8, method=Image.MEDIANCUT, dither=Image.NONE)
quantize 後再轉回 RGB,最後輸出 PNG-8 indexed color。檔案從 50KB 壓到 500 bytes。
3. 透明背景
AI 預設生白色或深色背景。要把單一色背景改成透明:
img = img.convert("RGBA")
data = img.getdata()
new_data = [
(255,255,255,0) if px[:3] == (255,255,255) else px
for px in data
]
img.putdata(new_data)
這個簡化版只處理純白背景。實際上 AI 生的「白」常有 anti-alias 邊緣,需要 tolerance(abs(r-255) < 10 之類的判斷)。
4. 風格不一致的修補
28 張裡總會有 2–3 張完全跑調 — 顏色太亮、構圖偏離。這時候我手動用 Aseprite 微調:把違和的像素點掉、調幾個顏色、補一些線條。每張 5–10 分鐘搞定。
實際數據
| 項目 | 數量 / 時間 |
|---|---|
| 初版 prompt 試錯 | 1 小時 |
| 定稿 prompt 模板 | 30 分鐘 |
| 28 張批次生成(每張 4 變體) | 1 小時 |
| 挑選 + 後處理 | 30 分鐘 |
| 不滿意的手動修補(3 張) | 30 分鐘 |
| 總計 | 3.5 小時 |
| 最終檔案總大小 | 14.2 KB(28 張 PNG-8) |
哪些任務 AI 生圖適合 / 不適合
用了一年下來盤點:
| 任務類型 | AI 生圖表現 |
|---|---|
| 大量低密度素材(icon、tile) | ★★★★★ |
| 背景圖、氣氛圖 | ★★★★ |
| 角色立繪(單張) | ★★★(一致性差) |
| 角色動畫(多 frame) | ★(極難維持一致性) |
| UI 元素(按鈕、邊框) | ★★(不如 CSS 寫死) |
| logo、品牌識別 | ★(必須人工) |
版權與商業使用考量
這是大家最關心的問題。我的政策是:
- 用本地版 Stable Diffusion + 開源模型:商業使用條款明確,沒有歸屬問題。
- 避免用其他畫家名字當 prompt:「in the style of XXX」這種寫法在道德跟法律上都有爭議。
- 明顯的二創作品手動重畫:如果 AI 生出來的東西明顯模仿到某個特定 IP,就不用,重生。
- 保留 prompt 與 seed 紀錄:方便未來 audit。
結語
AI 生圖在獨立遊戲開發的角色是「美術放大器」 — 不是取代美術,是讓一個有美學品味、有 prompt 工程能力的人,產出原本只有團隊才能產出的素材量。對 1 人工作室,這個工具讓「一款遊戲一張原創美術都用得起」變成可能。
下一篇我想寫「用 AI 寫 NPC 對話文本」的工作流。如果你有特定想看的 AI 工作流主題,歡迎寄信 lo246179268@gmail.com。