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-х | адаптивная 16 | 8px | Яркие постеры, главная иллюстрация |
snes | 16-bit | адаптивная 32 | 4px | Персонажи, детальные сцены |
nes | 8-bit | NES (54) | 8px | Аутентичный вид NES |
gameboy | Game Boy DMG | 4 оттенка зелёного | 8px | Монохромный Game Boy |
gameboy_pocket | Game Boy Pocket | 4 оттенка серого | 8px | Моно GB Pocket |
pico8 | PICO-8 | 16 фиксированных | 6px | Вид фэнтези-консоли |
c64 | Commodore 64 | 16 фиксированных | 8px | 8-битный домашний компьютер |
apple2 | Apple II hi-res | 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 | Kawaii / нежное |
Именованные палитры лежат в 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
Логика конвейера
Конвертация в пиксели:
- Усилить контраст/цвет/резкость (сильнее для палитр поменьше)
- Постеризовать, чтобы упростить тональные области перед квантованием
- Уменьшить на
blockсImage.NEAREST(жёсткие пиксели, без интерполяции) - Квантовать с дизерингом по Флойду–Стейнбергу — по адаптивной N-цветной палитре либо по именованной аппаратной палитре
- Увеличить обратно с
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 в каталоге этого навыка.