Перейти к основному содержимому

Pixel Art

Пиксель-арт с палитрами эпох (NES, Game Boy, PICO-8).

Метаданные навыка​

ИсточникОпционально — установка с помощью vibeos 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​

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.

Pixel Art

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

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

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

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

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

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

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

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

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

Вызовите clarify с 4 репрезентативными пресетами. Выбирайте набор в зависимости от того, что запросил пользователь — не вываливайте все 14.

Меню по умолчанию, когда намерение пользователя неясно:

clarify(
question="Какой стиль пиксель-арта вы хотите?",
choices=[
"arcade — смелый, рубленый стиль аркад 80-х (16 цветов, 8px)",
"nes — аппаратная палитра Nintendo 8-bit (54 цвета, 8px)",
"gameboy — 4-оттеночный зелёный Game Boy DMG",
"snes — более чистый 16-битный вид (32 цвета, 4px)",
],
)

Когда пользователь уже назвал эпоху (например, «аркады 80-х», «Gameboy»), пропустите clarify и используйте соответствующий пресет напрямую.

Шаг 2 — Предложите анимацию (опционально)​

Если пользователь запросил видео/GIF или результат может выиграть от движения, спросите, какую сцену:

clarify(
question="Хотите анимировать? Выберите сцену или пропустите.",
choices=[
"night — звёзды + светлячки + листья",
"urban — дождь + неоновые импульсы",
"snow — падающие снежинки",
"skip — только изображение",
],
)

НЕ вызывайте clarify более двух раз подряд. Один раз для стиля, один раз для сцены, если анимация рассматривается. Если пользователь явно указал конкретный стиль и сцену в своём сообщении, пропустите clarify полностью.

Шаг 3 — Генерация​

Сначала запустите pixel_art(); если была запрошена анимация, передайте результат в pixel_art_video().

Каталог пресетов​

ПресетЭпохаПалитраБлокЛучше всего для
arcadeАркады 80-хадаптивная 168pxСмелые постеры, главные арты
snes16-битадаптивная 324pxПерсонажи, детализированные сцены
nes8-битNES (54)8pxАутентичный вид NES
gameboyПортативная DMG4 зелёных оттенка8pxМонохромный Game Boy
gameboy_pocketПортативная Pocket4 серых оттенка8pxМонохромный GB Pocket
pico8PICO-816 фиксированных6pxСтиль фэнтези-консоли
c64Commodore 6416 фиксированных8px8-битный домашний компьютер
apple2Apple II hi-res6 фиксированных10pxЭкстремальное ретро, 6 цветов
teletextBBC Teletext8 чистых10pxРубленые основные цвета
mspaintWindows MS Paint24 фиксированных8pxНостальгический рабочий стол
mono_greenCRT фосфор2 зелёных6pxЭстетика терминала/CRT
mono_amberCRT янтарный2 янтарных6pxВид янтарного монитора
neonКиберпанк10 неоновых6pxVaporwave/кибер
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/.vibeos/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/.vibeos/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 (требуется только для видео — VibeOS устанавливает этот пакет)

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

  • Ключи палитр чувствительны к регистру ("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). Подробности см. в ATTRIBUTION.md в директории этого навыка.