Pixel Art

Пиксель-арт с палитрами эпох (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 загружает при его срабатывании. Именно это видит агент в качестве инструкций, пока навык активен.

Pixel Art

Превращает любое изображение в ретро-пиксель-арт, а затем при желании анимирует его в короткий MP4 или GIF с эффектами под эпоху (дождь, светлячки, снег, угли).

С навыком поставляются два скрипта:

  • scripts/pixel_art.py — фото → PNG в пиксель-арте (дизеринг по Флойду–Стейнбергу)
  • scripts/pixel_art_video.py — PNG в пиксель-арте → анимированный MP4 (+ опционально GIF)

Каждый можно импортировать или запускать напрямую. Пресеты привязываются к аппаратным палитрам, когда нужны точные цвета эпохи (NES, Game Boy, PICO-8 и др.), либо используют адаптивное N-цветное квантование для стиля arcade/SNES.

Когда использовать

  • Пользователю нужен ретро-пиксель-арт из исходного изображения
  • Пользователь просит стиль NES / Game Boy / PICO-8 / C64 / arcade / SNES
  • Нужна короткая зацикленная анимация (сцена с дождём, ночное небо, снег и т.п.)
  • Постеры, обложки альбомов, посты в соцсети, спрайты, персонажи, аватары

Рабочий процесс

Перед генерацией согласуйте стиль с пользователем. Разные пресеты дают очень разный результат, а перегенерация обходится дорого.

Шаг 1 — Предложите стиль

Вызовите clarify с 4 показательными пресетами. Подбирайте набор под запрос пользователя — не вываливайте все 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Аркады 80-хадаптивная 168pxЯркие постеры, главная иллюстрация
snes16-bitадаптивная 324pxПерсонажи, детальные сцены
nes8-bitNES (54)8pxАутентичный вид NES
gameboyGame Boy DMG4 оттенка зелёного8pxМонохромный Game Boy
gameboy_pocketGame Boy Pocket4 оттенка серого8pxМоно GB Pocket
pico8PICO-816 фиксированных6pxВид фэнтези-консоли
c64Commodore 6416 фиксированных8px8-битный домашний компьютер
apple2Apple II hi-res6 фиксированных10pxЭкстремальное ретро, 6 цветов
teletextBBC Teletext8 чистых10pxКрупные основные цвета
mspaintWindows MS Paint24 фиксированных8pxНостальгия по десктопу
mono_greenЛюминофор CRT2 зелёных6pxЭстетика терминала/CRT
mono_amberЯнтарный CRT2 янтарных6pxВид янтарного монитора
neonКиберпанк10 неоновых6pxVaporwave/cyber
pastelМягкая пастель10 пастельных6pxKawaii / нежное

Именованные палитры лежат в 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
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. Конвертация в пиксель-арт
pixel_art("/path/to/photo.jpg", "/tmp/pixel.png", preset="nes")

# 2. Анимация (опционально)
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. Уменьшить на block с Image.NEAREST (жёсткие пиксели, без интерполяции)
  4. Квантовать с дизерингом по Флойду–Стейнбергу — по адаптивной N-цветной палитре либо по именованной аппаратной палитре
  5. Увеличить обратно с Image.NEAREST

Квантование ПОСЛЕ уменьшения держит дизеринг в одной сетке с итоговыми пикселями. Квантование до уменьшения растратило бы рассеивание ошибки на детали, которые всё равно исчезнут.

Наложение видео:

  • Копирует базовый кадр на каждом тике (статичный фон)
  • Накладывает покадровую отрисовку частиц без состояния (по одной функции на эффект)
  • Кодирует через ffmpeg libx264 -pix_fmt yuv420p -crf 18
  • Опциональный GIF через palettegen + paletteuse

Зависимости

  • Python 3.9+
  • Pillow (pip install Pillow)
  • ffmpeg в PATH (нужен только для видео — Hermes устанавливает этот пакет)

Подводные камни

  • Ключи палитр чувствительны к регистру ("NES", "PICO_8", "GAMEBOY_ORIGINAL").
  • Очень мелкие исходники (<100px по ширине) разваливаются на блоках 8–10px. Сначала увеличьте источник, если он крошечный.
  • Дробные block или palette сломают квантование — держите их положительными целыми.
  • Количество частиц анимации настроено под холсты ~640×480. На очень больших изображениях попробуйте второй проход с другим seed для нужной плотности.
  • 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 в каталоге этого навыка.

ESC