跳到主要内容

像素艺术 (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()

预设目录

预设时代调色板块大小最佳用途
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 进行编码
  • 可选 GIF,通过 palettegen + paletteuse 生成

依赖项

  • 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(去饱和)。如果你覆盖并保持色度,双色调色板可能在平滑区域产生条纹。
  • clarify 循环:每轮最多调用两次(先风格,后场景)。不要用更多的选择打扰用户。

验证

  • PNG 文件在输出路径创建
  • 在预设的块大小下可见清晰的方形像素块
  • 颜色数量与预设匹配(目测图像或运行 Image.open(p).getcolors()
  • 视频是有效的 MP4(ffprobe 可以打开它),且大小非零

归属

命名硬件调色板和 pixel_art_video.py 中的程序化动画循环移植自 pixel-art-studio(MIT)。详见此技能目录中的 ATTRIBUTION.md