跳到主要內容

像素藝術

帶有時代調色板的像素藝術(NES、Game Boy、PICO-8)。

技能元數據

來源可選 — 使用 hermes skills install official/creative/pixel-art 安裝
路徑optional-skills/creative/pixel-art
版本2.0.0
作者dodo-reach
許可證MIT
平臺linux, macos, windows
標籤creative, pixel-art, arcade, snes, nes, gameboy, retro, image, video

參考:完整 SKILL.md

信息

以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理看到的指令。

像素藝術

將任何圖像轉換為復古像素藝術,然後可選擇將其動畫化為帶有符合時代特徵效果(雨、螢火蟲、雪、餘燼)的短 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()

預設目錄

預設時代調色板塊大小最佳用途
arcade80 年代街機自適應 16 色8px大膽的海報、主視覺圖
snes16 位自適應 32 色4px角色、細節豐富的場景
nes8 位NES (54)8px真正的 NES 外觀
gameboyDMG 掌機4 種綠色色調8px單色 Game Boy
gameboy_pocketPocket 掌機4 種灰色色調8px單色 GB Pocket
pico8PICO-816 固定色6px幻想主機外觀
c64Commodore 6416 固定色8px8 位家用電腦
apple2Apple II 高分辨率6 固定色10px極致復古,6 種顏色
teletextBBC Teletext8 純色10px粗獷的原色
mspaintWindows MS Paint24 固定色8px懷舊桌面
mono_greenCRT 熒光粉2 種綠色6px終端/CRT 美學
mono_amberCRT 琥珀色2 種琥珀色6px琥珀色顯示器外觀
neon賽博朋克10 種霓虹色6px蒸汽波/賽博
pastel柔和 pastel10 種 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

管道原理

像素轉換:

  1. 增強對比度/顏色/銳度(對於較小的調色板更強)
  2. 色調分離以在量化前簡化色調區域
  3. 使用 Image.NEARESTblock 下采樣(硬像素,無插值)
  4. 使用 Floyd-Steinberg 抖動進行量化——針對自適應 N 色調色板或命名硬件調色板
  5. 使用 Image.NEAREST 上採樣回原尺寸

在下采樣之後進行量化可保持抖動與最終像素網格對齊。如果在之前進行量化,則會浪費誤差擴散在即將消失的細節上。

視頻疊加:

  • 每幀複製基礎幀(靜態背景)
  • 疊加無狀態的逐幀粒子繪製(每種效果一個函數)
  • 通過 ffmpeg libx264 -pix_fmt yuv420p -crf 18 進行編碼
  • 可選通過 palettegen + paletteuse 生成 GIF

依賴項

  • Python 3.9+
  • Pillow (pip install Pillow)
  • PATH 中的 ffmpeg(僅視頻需要 — Hermes 會安裝此包)

注意事項

  • 調色板鍵名區分大小寫("NES""PICO_8""GAMEBOY_ORIGINAL")。
  • 非常小的源圖像(寬度 <100px)在 8-10px 的塊下會失真。如果源圖像很小,請先將其放大。
  • 分數形式的 blockpalette 會破壞量化——請保持它們為正整數。
  • 動畫粒子數量是針對 ~640x480 畫布調整的。在非常大的圖像上,你可能需要使用不同的種子進行第二次處理以調整密度。
  • mono_green / mono_amber 強制 color=0.0(去飽和)。如果你覆蓋此設置並保留色度,2 色調色板可能在平滑區域產生條紋。
  • clarify 循環:每輪最多調用兩次(先風格,後場景)。不要用更多的選項讓用戶感到困擾。

驗證

  • PNG 文件已在輸出路徑創建
  • 在預設的塊大小下可見清晰的方形像素塊
  • 顏色數量與預設匹配(目視檢查圖像或運行 Image.open(p).getcolors()
  • 視頻是有效的 MP4(ffprobe 可以打開它)且大小非零

歸屬

命名硬件調色板和 pixel_art_video.py 中的程序化動畫循環移植自 pixel-art-studio(MIT 許可證)。詳見此技能目錄中的 ATTRIBUTION.md