像素藝術 (Pixel Art)
使用硬件精確調色板(NES、Game Boy、PICO-8、C64 等)將圖像轉換為復古像素藝術,並將其製作成短視頻動畫。預設涵蓋街機、SNES 以及 10 多種符合時代特徵的風格。在生成之前,使用 clarify 讓用戶選擇風格。
技能元數據
| 來源 | 捆綁(默認安裝) |
| 路徑 | skills/creative/pixel-art |
| 版本 | 2.0.0 |
| 作者 | dodo-reach |
| 許可證 | MIT |
| 標籤 | creative, pixel-art, arcade, snes, nes, gameboy, retro, image, video |
參考:完整 SKILL.md
以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理所看到的指令。
像素藝術 (Pixel Art)
將任何圖像轉換為復古像素藝術,然後可選地將其製作為帶有符合時代特徵效果(雨、螢火蟲、雪、餘燼)的短 MP4 或 GIF 動畫。
此技能附帶兩個腳本:
scripts/pixel_art.py— 照片 → 像素藝術 PNG(Floyd-Steinberg 抖動)scripts/pixel_art_video.py— 像素藝術 PNG → 動畫 MP4(+ 可選 GIF)
兩者均可導入或直接運行。當您需要符合時代特徵的準確顏色(NES、Game Boy、PICO-8 等)時,預設會鎖定到硬件調色板;或者使用自適應 N 色量化來實現街機/SNES 風格的視覺效果。
何時使用
- 用戶希望從源圖像生成復古像素藝術
- 用戶要求 NES / Game Boy / PICO-8 / C64 / 街機 / SNES 風格
- 用戶想要簡短的循環動畫(雨景、夜空、雪景等)
- 海報、專輯封面、社交媒體帖子、精靈圖、角色、頭像
工作流程
在生成之前,與用戶確認風格。不同的預設會產生截然不同的輸出,且重新生成的成本較高。
步驟 1 — 提供風格選項
使用 4 個具有代表性的預設調用 clarify。根據用戶的要求選擇集合——不要直接列出全部 14 個。
當用戶意圖不明確時的默認菜單:
clarify(
question="Which pixel-art style do you want?",
choices=[
"arcade — bold, chunky 80s cabinet feel (16 colors, 8px)",
"nes — Nintendo 8-bit hardware palette (54 colors, 8px)",
"gameboy — 4-shade green Game Boy DMG",
"snes — cleaner 16-bit look (32 colors, 4px)",
],
)
當用戶已經指定了時代(例如“80 年代街機”、“Gameboy”)時,跳過 clarify 並直接使用匹配的預設。
步驟 2 — 提供動畫選項(可選)
如果用戶要求視頻/GIF,或者輸出可能因動態效果而受益,詢問選擇哪種場景:
clarify(
question="Want to animate it? Pick a scene or skip.",
choices=[
"night — stars + fireflies + leaves",
"urban — rain + neon pulse",
"snow — falling snowflakes",
"skip — just the image",
],
)
切勿連續調用 clarify 超過兩次。一次用於風格,如果涉及動畫,一次用於場景。如果用戶在消息中明確要求的特定風格和場景,則完全跳過 clarify。
步驟 3 — 生成
首先運行 pixel_art();如果請求了動畫,則在結果上鍊式調用 pixel_art_video()。
預設目錄
| 預設 | 時代 | 調色板 | 塊大小 | 最佳用途 |
|---|---|---|---|---|
arcade | 80 年代街機 | 自適應 16 色 | 8px | 醒目的海報、主視覺圖 |
snes | 16 位 | 自適應 32 色 | 4px | 角色、細節豐富的場景 |
nes | 8 位 | NES (54 色) | 8px | 真實的 NES 外觀 |
gameboy | DMG 掌機 | 4 種綠色調 | 8px | 單色 Game Boy |
gameboy_pocket | Pocket 掌機 | 4 種灰色調 | 8px | 單色 GB Pocket |
pico8 | PICO-8 | 16 種固定色 | 6px | 幻想主機外觀 |
c64 | Commodore 64 | 16 種固定色 | 8px | 8 位家用電腦 |
apple2 | Apple II 高分辨率 | 6 種固定色 | 10px | 極致復古,6 種顏色 |
teletext | BBC Teletext | 8 種純色 | 10px | 粗獷的原色 |
mspaint | Windows MS Paint | 24 種固定色 | 8px | 懷舊桌面風格 |
mono_green | CRT 熒光粉 | 2 種綠色 | 6px | 終端/CRT 美學 |
mono_amber | CRT 琥珀色 | 2 種琥珀色 | 6px | 琥珀色顯示器外觀 |
neon | 賽博朋克 | 10 種霓虹色 | 6px | 蒸汽波/賽博風格 |
pastel | 柔和 pastel | 10 種 pastel 色 | 6px | 可愛 / 溫柔風格 |
命名調色板位於 scripts/palettes.py 中(參見 references/palettes.md 獲取完整列表——總共 28 種命名調色板)。可以覆蓋任何預設:
pixel_art("in.png", "out.png", preset="snes", palette="PICO_8", block=6)
場景目錄(用於視頻)
| 場景 | 效果 |
|---|---|
night | 閃爍的星星 + 螢火蟲 + 飄落的樹葉 |
dusk | 螢火蟲 + 火花 |
tavern | 塵埃微粒 + 溫暖火花 |
indoor | 塵埃微粒 |
urban | 雨 + 霓虹脈衝 |
nature | 樹葉 + 螢火蟲 |
magic | 火花 + 螢火蟲 |
storm | 雨 + 閃電 |
underwater | 氣泡 + 光點火花 |
fire | 餘燼 + 火花 |
snow | 雪花 + 火花 |
desert | 熱浪 shimmer + 塵埃 |
調用模式
Python(導入)
import sys
sys.path.insert(0, "/home/teknium/.hermes/skills/creative/pixel-art/scripts")
from pixel_art import pixel_art
from pixel_art_video import pixel_art_video
# 1. Convert to pixel art
pixel_art("/path/to/photo.jpg", "/tmp/pixel.png", preset="nes")
# 2. Animate (optional)
pixel_art_video(
"/tmp/pixel.png",
"/tmp/pixel.mp4",
scene="night",
duration=6,
fps=15,
seed=42,
export_gif=True,
)
CLI
cd /home/teknium/.hermes/skills/creative/pixel-art/scripts
python pixel_art.py in.jpg out.png --preset gameboy
python pixel_art.py in.jpg out.png --preset snes --palette PICO_8 --block 6
python pixel_art_video.py out.png out.mp4 --scene night --duration 6 --gif
管道原理
像素轉換:
- 增強對比度/顏色/銳度(對於較小的調色板效果更強)
- 色調分離以簡化量化前的色調區域
- 使用
Image.NEAREST按block縮小(硬像素,無插值) - 使用 Floyd-Steinberg 抖動進行量化——針對自適應 N 色調色板或命名硬件調色板
- 使用
Image.NEAREST放大回原尺寸
在縮小後量化可保持抖動與最終像素網格對齊。如果在縮小前量化,則會浪費誤差擴散於那些隨後會消失的細節上。
視頻疊加:
- 每幀複製基礎幀(靜態背景)
- 疊加無狀態逐幀粒子繪製(每個效果一個函數)
- 通過 ffmpeg
libx264 -pix_fmt yuv420p -crf 18進行編碼 - 可選 GIF,通過
palettegen+paletteuse生成
依賴項
- Python 3.9+
- Pillow (
pip install Pillow) - PATH 中的 ffmpeg(僅視頻需要 — Hermes 會安裝此包)
注意事項
- 調色板鍵名區分大小寫(
"NES"、"PICO_8"、"GAMEBOY_ORIGINAL")。 - 非常小的源圖像(寬度 <100px)在 8-10px 的塊下會失真。如果源圖像很小,請先將其放大。
- 分數形式的
block或palette會破壞量化 — 請保持它們為正整數。 - 動畫粒子數量是針對 ~640x480 畫布調整的。在非常大的圖像上,你可能需要使用不同的種子進行第二次處理以調整密度。
mono_green/mono_amber強制color=0.0(去飽和)。如果你覆蓋並保持色度,雙色調色板可能在平滑區域產生條紋。clarify循環:每輪最多調用兩次(先風格,後場景)。不要用更多的選擇打擾用戶。
驗證
- PNG 文件在輸出路徑創建
- 在預設的塊大小下可見清晰的方形像素塊
- 顏色數量與預設匹配(目測圖像或運行
Image.open(p).getcolors()) - 視頻是有效的 MP4(
ffprobe可以打開它),且大小非零
歸屬
命名硬件調色板和 pixel_art_video.py 中的程序化動畫循環移植自 pixel-art-studio(MIT)。詳見此技能目錄中的 ATTRIBUTION.md。