Slack GIF Creator
Набор кубиков, а не готовых рецептов: валидаторы под ограничения Slack,
композируемые примитивы анимации и хелперы отрисовки. Как их сочетать — решай под
замысел.
Ограничения Slack
|
Message GIF |
Emoji GIF |
| Максимальный размер |
~2 MB |
64 KB (жёстко) |
| Размер кадра |
480×480 |
128×128 |
| FPS |
15–20 |
10–12 |
| Палитра |
128–256 цветов |
32–48 цветов |
| Длительность |
2–5 с |
1–2 с |
Emoji — сложный случай. 64 KB не обходятся ничем, кроме сокращения: 10–15
кадров всего, ≤48 цветов, простая композиция без градиентов (сплошные цвета
жмутся кратно лучше). Проверяй размер файла ПО ХОДУ работы, а не в конце: узнать
на двадцатом кадре, что не влезаешь, значит переделывать всю анимацию.
Рабочий цикл
from core.gif_builder import GIFBuilder
from core.validators import check_slack_size
builder = GIFBuilder(width=128, height=128, fps=10)
# ... добавляешь кадры любым способом: builder.add_frame(frame) ...
info = builder.save('emoji.gif', num_colors=48, optimize_for_emoji=True)
passes, details = check_slack_size('emoji.gif', is_emoji=True)
save() сам квантует палитру, выбрасывает дубли кадров и предупреждает о
превышении лимита; info возвращает size_kb, frame_count,
duration_seconds. Полная валидация — validate_gif(path, is_emoji=True),
быстрая проверка — is_slack_ready(path, is_emoji=True).
Что уже написано
| Модуль |
Что даёт |
templates/shake · bounce · spin · pulse · wiggle |
тряска, отскок, вращение/спиннер, пульс и «сердцебиение», желейное дрожание |
templates/move · slide · zoom · flip |
движение по прямой/дуге/окружности/волне, выезд с overshoot, наезд с motion blur, переворот двух объектов |
templates/fade · morph · explode · kaleidoscope |
появление/исчезание, кроссфейд и морфинг, взрыв/осколки/растворение и частицы, калейдоскоп и зеркала |
core/gif_builder |
сборка, квантование, выброс дублей, предупреждения о лимитах |
core/validators |
проверки размера, габаритов, полная валидация |
core/easing |
interpolate(start, end, t, easing=...): ease_in/out, bounce_out, elastic_out, back_out |
core/frame_composer |
градиентный фон, эмодзи с тенью, фигуры, звёзды |
core/typography |
draw_text_with_outline — обводка, без неё текст на 128×128 нечитаем |
core/color_palettes |
готовые палитры: vibrant, pastel, dark, neon, professional |
core/visual_effects |
частицы (ParticleSystem), вспышка удара, ударные волны |
Точные сигнатуры вызовов и примеры композиции → references/primitives.md.
Открывай, когда берёшь конкретный примитив и нужен его набор аргументов. Каждый
хелпер можно заменить своим кодом — они не обязательны, обязательны только лимиты
Slack.
Когда GIF не влезает
Message (>2 MB): меньше кадров (ниже FPS или короче) → меньше цветов (128 →
64) → меньше габарит (480 → 320) → включить выброс дублей.
Emoji (>64 KB) — резать агрессивно: 10–12 кадров всего, 32–40 цветов, убрать
градиенты, упростить композицию, optimize_for_emoji=True в save().
Порядок именно такой: число кадров даёт самую большую экономию при наименьшей
потере смысла, габарит — самую заметную потерю.
Как подходить к запросу
- Понять замысел: что происходит и какое настроение.
- Разбить на фазы — подготовка, действие, реакция. Без фаз анимация читается как
дёрганье.
- Собрать из примитивов, смешивая свободно.
- Проверить лимиты, особенно для emoji.
- Не влезло — сокращать по лестнице выше, а не пережимать палитру вслепую.
Зависимости
Ставить, только если их ещё нет:
pip install pillow imageio numpy
1---2name: slack-gif-creator3description: Анимированные GIF под лимиты Slack (emoji 64KB): валидаторы и анимационные примитивы. Триггеры: «гифка для slack», «slack emoji».4license: Complete terms in LICENSE.txt5---67# Slack GIF Creator89Набор кубиков, а не готовых рецептов: валидаторы под ограничения Slack,10композируемые примитивы анимации и хелперы отрисовки. Как их сочетать — решай под11замысел.1213## Ограничения Slack1415| | Message GIF | Emoji GIF |16|---|---|---|17| Максимальный размер | ~2 MB | **64 KB (жёстко)** |18| Размер кадра | 480×480 | 128×128 |19| FPS | 15–20 | 10–12 |20| Палитра | 128–256 цветов | 32–48 цветов |21| Длительность | 2–5 с | 1–2 с |2223**Emoji — сложный случай.** 64 KB не обходятся ничем, кроме сокращения: 10–1524кадров всего, ≤48 цветов, простая композиция без градиентов (сплошные цвета25жмутся кратно лучше). Проверяй размер файла ПО ХОДУ работы, а не в конце: узнать26на двадцатом кадре, что не влезаешь, значит переделывать всю анимацию.2728## Рабочий цикл2930```python31from core.gif_builder import GIFBuilder32from core.validators import check_slack_size3334builder = GIFBuilder(width=128, height=128, fps=10)35# ... добавляешь кадры любым способом: builder.add_frame(frame) ...36info = builder.save('emoji.gif', num_colors=48, optimize_for_emoji=True)37passes, details = check_slack_size('emoji.gif', is_emoji=True)38```3940`save()` сам квантует палитру, выбрасывает дубли кадров и предупреждает о41превышении лимита; `info` возвращает `size_kb`, `frame_count`,42`duration_seconds`. Полная валидация — `validate_gif(path, is_emoji=True)`,43быстрая проверка — `is_slack_ready(path, is_emoji=True)`.4445## Что уже написано4647| Модуль | Что даёт |48|---|---|49| `templates/shake · bounce · spin · pulse · wiggle` | тряска, отскок, вращение/спиннер, пульс и «сердцебиение», желейное дрожание |50| `templates/move · slide · zoom · flip` | движение по прямой/дуге/окружности/волне, выезд с overshoot, наезд с motion blur, переворот двух объектов |51| `templates/fade · morph · explode · kaleidoscope` | появление/исчезание, кроссфейд и морфинг, взрыв/осколки/растворение и частицы, калейдоскоп и зеркала |52| `core/gif_builder` | сборка, квантование, выброс дублей, предупреждения о лимитах |53| `core/validators` | проверки размера, габаритов, полная валидация |54| `core/easing` | `interpolate(start, end, t, easing=...)`: `ease_in/out`, `bounce_out`, `elastic_out`, `back_out` |55| `core/frame_composer` | градиентный фон, эмодзи с тенью, фигуры, звёзды |56| `core/typography` | `draw_text_with_outline` — обводка, без неё текст на 128×128 нечитаем |57| `core/color_palettes` | готовые палитры: `vibrant`, `pastel`, `dark`, `neon`, `professional` |58| `core/visual_effects` | частицы (`ParticleSystem`), вспышка удара, ударные волны |5960**Точные сигнатуры вызовов и примеры композиции → `references/primitives.md`.**61Открывай, когда берёшь конкретный примитив и нужен его набор аргументов. Каждый62хелпер можно заменить своим кодом — они не обязательны, обязательны только лимиты63Slack.6465## Когда GIF не влезает6667**Message (>2 MB):** меньше кадров (ниже FPS или короче) → меньше цветов (128 →6864) → меньше габарит (480 → 320) → включить выброс дублей.6970**Emoji (>64 KB) — резать агрессивно:** 10–12 кадров всего, 32–40 цветов, убрать71градиенты, упростить композицию, `optimize_for_emoji=True` в `save()`.7273Порядок именно такой: число кадров даёт самую большую экономию при наименьшей74потере смысла, габарит — самую заметную потерю.7576## Как подходить к запросу77781. Понять замысел: что происходит и какое настроение.792. Разбить на фазы — подготовка, действие, реакция. Без фаз анимация читается как80 дёрганье.813. Собрать из примитивов, смешивая свободно.824. Проверить лимиты, особенно для emoji.835. Не влезло — сокращать по лестнице выше, а не пережимать палитру вслепую.8485## Зависимости8687Ставить, только если их ещё нет:8889```bash90pip install pillow imageio numpy91```