On this page Пиксель-арт с эпохальными палитрами (NES, Game Boy, PICO-8).
Skill metadata¶
| |
|---|--- |
Source| Встроенный (установлен по умолчанию) |
Path| skills/creative/pixel-art |
Version| 2.0.0 |
Author| dodo-reach |
License| MIT |
Tags| creative, pixel-art, arcade, snes, nes, gameboy, retro, image, video |
Reference: full SKILL.md¶
info Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Это то, что агент видит в качестве инструкций, когда навык активен.
Pixel Art¶
Конвертируйте любое изображение в ретро-пиксель-арт, а затем опционально анимируйте в короткий MP4 или GIF с эффектами соответствующей эпохи (дождь, светлячки, снег, искры).
С этим навыком поставляются два скрипта:
* scripts/pixel_art.py — фото → пиксель-арт PNG (дизеринг Флойда-Стейнберга)
* scripts/pixel_art_video.py — пиксель-арт PNG → анимированный MP4 (+ опционально GIF)
Каждый можно импортировать или запускать напрямую. Пресеты привязываются к аппаратным палитрам, когда нужны цвета, соответствующие эпохе (NES, Game Boy, PICO-8 и т.д.), или используйте адаптивную N-цветную квантизацию для стиля аркад/SNES.
When to Use¶
- Пользователь хочет ретро-пиксель-арт из исходного изображения
- Пользователь просит стиль NES / Game Boy / PICO-8 / C64 / аркада / SNES
- Пользователь хочет короткую зацикленную анимацию (сцена дождя, ночное небо, снег и т.д.)
- Постеры, обложки альбомов, посты в соцсетях, спрайты, персонажи, аватары
Workflow¶
Перед генерацией подтвердите стиль с пользователем. Разные пресеты дают очень разные результаты, а перегенерация затратна.
Step 1 — Offer a style¶
Вызовите clarify с 4 репрезентативными пресетами. Выбирайте набор в зависимости от того, что просит пользователь — не вываливайте все 14.
Меню по умолчанию, когда намерение пользователя неясно:
[code]
clarify(
question="Какой стиль пиксель-арта вы хотите?",
choices=[
"arcade — жирный, коренастый стиль аркад 80-х (16 цветов, 8px)",
"nes — аппаратная палитра Nintendo 8-bit (54 цвета, 8px)",
"gameboy — 4-оттеночный зелёный Game Boy DMG",
"snes — более чистый 16-битный вид (32 цвета, 4px)",
],
)
[/code]
Когда пользователь уже назвал эпоху (например, «аркада 80-х», «Gameboy»), пропустите clarify и используйте соответствующий пресет напрямую.
Step 2 — Offer animation (optional)¶
Если пользователь попросил видео/GIF или результат может выиграть от движения, спросите, какую сцену:
[code]
clarify(
question="Хотите анимировать? Выберите сцену или пропустите.",
choices=[
"night — звёзды + светлячки + листья",
"urban — дождь + неоновые импульсы",
"snow — падающие снежинки",
"skip — только изображение",
],
)
[/code]
НЕ вызывайте clarify более двух раз подряд. Один раз для стиля, один раз для сцены, если анимация возможна. Если пользователь явно запросил конкретный стиль и сцену в своём сообщении, пропустите clarify полностью.
Step 3 — Generate¶
Запустите pixel_art() сначала; если запрошена анимация, передайте результат в pixel_art_video().
Preset Catalog¶
| Пресет | Эпоха | Палитра | Блок | Лучше всего для |
|---|---|---|---|---|
arcade |
Аркады 80-х | adaptive 16 | 8px | Жирные постеры, героический арт |
snes |
16-бит | adaptive 32 | 4px | Персонажи, детализированные сцены |
nes |
8-бит | 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 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 именованных палитр). Любой пресет можно переопределить: |
||||
| [code] | ||||
| pixel_art("in.png", "out.png", preset="snes", palette="PICO_8", block=6) |
[/code]
Scene Catalog (for video)¶
| Сцена | Эффекты |
|---|---|
night |
Мерцающие звёзды + светлячки + дрейфующие листья |
dusk |
Светлячки + искры |
tavern |
Пылинки + тёплые искры |
indoor |
Пылинки |
urban |
Дождь + неоновые импульсы |
nature |
Листья + светлячки |
magic |
Искры + светлячки |
storm |
Дождь + молнии |
underwater |
Пузырьки + световые искры |
fire |
Угольки + искры |
snow |
Снежинки + искры |
desert |
Мерцание жара + пыль |
| ## Invocation Patterns | |
| ### Python (import) | |
| [code] | |
| 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,
)
[/code]
CLI¶
[code] 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
[/code]
Pipeline Rationale¶
Конвертация в пиксели:
1. Усиление контраста/цвета/резкости (сильнее для маленьких палитр)
2. Постеризация для упрощения тональных областей перед квантизацией
3. Уменьшение масштаба на block с Image.NEAREST (жёсткие пиксели, без интерполяции)
4. Квантизация с дизерингом Флойда-Стейнберга — по адаптивной N-цветной палитре ИЛИ именованной аппаратной палитре
5. Увеличение обратно с Image.NEAREST
Квантизация ПОСЛЕ уменьшения масштаба сохраняет дизеринг выровненным по финальной сетке пикселей. Квантизация до удалила бы диффузию ошибки на деталях, которые исчезают.
Видео-наложение:
* Копирует базовый кадр каждый тик (статический фон)
* Накладывает не сохраняющие состояние покадровые отрисовки частиц (одна функция на эффект)
* Кодируется через ffmpeg libx264 -pix_fmt yuv420p -crf 18
* Опциональный GIF через palettegen + paletteuse
Dependencies¶
- Python 3.9+
- Pillow (
pip install Pillow) - ffmpeg в PATH (нужен только для видео — Hermes устанавливает этот пакет)
Pitfalls¶
- Ключи палитр чувствительны к регистру (
"NES","PICO_8","GAMEBOY_ORIGINAL"). - Очень маленькие источники (<100px в ширину) «схлопываются» под блоками 8-10px. Увеличьте источник, если он крошечный.
- Дробный
blockилиpaletteсломают квантизацию — используйте положительные целые числа. - Количество частиц в анимации настроено для холстов ~640x480. Для очень больших изображений может понадобиться второй проход с другим seed для плотности.
mono_green/mono_amberфорсируютcolor=0.0(десатурация). Если переопределить и сохранить хрому, 2-цветная палитра может дать полосы на гладких областях.- Цикл
clarify: вызывайте максимум дважды за раз (стиль, затем сцена). Не засыпайте пользователя новыми вопросами.
Verification¶
- PNG создан по указанному пути вывода
- Чёткие квадратные блоки пикселей видны при размере блока пресета
- Количество цветов соответствует пресету (проверьте на глаз или выполните
Image.open(p).getcolors()) - Видео — валидный MP4 (
ffprobeможет открыть его) с ненулевым размером
Attribution¶
Именованные аппаратные палитры и процедурные анимационные циклы в pixel_art_video.py портированы из pixel-art-studio (MIT). См. ATTRIBUTION.md в директории навыка для подробностей.
* Skill metadata
* Reference: full SKILL.md
* When to Use
* Workflow
* Step 1 — Offer a style
* Step 2 — Offer animation (optional)
* Step 3 — Generate
* Preset Catalog
* Scene Catalog (for video)
* Invocation Patterns
* Python (import)
* CLI
* Pipeline Rationale
* Dependencies
* Pitfalls
* Verification
* Attribution