{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
Pixel Art
带时代调色板的像素艺术(NES、Game Boy、PICO-8)。
Skill 元数据
| 来源 | 可选 — 通过 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 在触发本 skill 时加载的完整 skill 定义。这是 agent 在 skill 激活时所看到的指令内容。
Pixel Art
把任何图片转成复古像素艺术,然后可选地用符合时代的特效(雨、萤火、雪、余烬)动画成一段短 MP4 或 GIF。
本 skill 随附两个脚本:
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)",
],
)
当用户已点了某个时代(例如"80s arcade"、"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 | 80s 街机 | 自适应 16 | 8px | 粗粝海报、主视觉 |
snes | 16-bit | 自适应 32 | 4px | 角色、精细场景 |
nes | 8-bit | 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-bit 家用电脑 |
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 | vaporwave/cyber |
pastel | 柔和粉彩 | 10 粉彩 | 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 | 热浪抖动 + 尘 |
调用方式
Python(导入)
import sys
import os
sys.path.insert(0, os.path.expanduser("~/.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
out = os.path.expanduser("~/.hermes/cache/scratch")
pixel_art("/path/to/photo.jpg", f"{out}/pixel.png", preset="nes")
# 2. Animate (optional)
pixel_art_video(
f"{out}/pixel.png",
f"{out}/pixel.mp4",
scene="night",
duration=6,
fps=15,
seed=42,
export_gif=True,
)
CLI
cd ~/.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(去饱和)。若你覆盖并保留色度,2 色调色板可能在平滑区域出条纹。clarify循环:每轮最多调两次(风格,然后场景)。别用更多选择烦用户。
验证
- PNG 建在输出路径
- 在预设块尺寸下可见清晰的方形像素块
- 颜色数匹配预设(肉眼看或跑
Image.open(p).getcolors()) - 视频是有效 MP4(
ffprobe能打开)且大小非零
署名
命名硬件调色板和 pixel_art_video.py 里的程序化动画循环移植自 pixel-art-studio(MIT)。细节见本 skill 目录的 ATTRIBUTION.md。