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-х | адаптивная 16 | 8px | Смелые постеры, главные арты |
snes | 16-бит | адаптивная 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-битный домашний компьютер |
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/кибер |
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/.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
Обоснование конвейера
Преобразование в пиксели:
- Усиление контраста/цвета/резкости (сильнее для маленьких палитр)
- Постеризация для упрощения тональных областей перед квантизацией
- Масштабирование вниз на
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 (требуется только для видео — 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 в директории этого навыка.