{/* 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

INFO

以下是 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()。

预设目录

预设时代调色板块最适合
arcade80s 街机自适应 168px粗粝海报、主视觉
snes16-bit自适应 324px角色、精细场景
nes8-bitNES (54)8px真 NES 外观
gameboyDMG 掌机4 级绿8px单色 Game Boy
gameboy_pocketPocket 掌机4 级灰8px单色 GB Pocket
pico8PICO-816 固定6px幻想主机外观
c64Commodore 6416 固定8px8-bit 家用电脑
apple2Apple II 高分辨6 固定10px极复古,6 色
teletextBBC Teletext8 纯色10px大块原色
mspaintWindows MS Paint24 固定8px怀旧桌面
mono_greenCRT 磷光2 绿6px终端/CRT 美学
mono_amberCRT 琥珀2 琥珀6px琥珀显示器
neon赛博朋克10 霓虹6pxvaporwave/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

管线原理

像素转换:

  1. 提升对比/颜色/锐度(调色板越小越强)
  2. 量化前先色调分离以简化色调区域
  3. 用 Image.NEAREST 按 block 缩小(硬像素,无插值)
  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 块下会塌掉。源太小时先放大。
  • 分数 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。