iiuniversitet.ruЦентр обучения нейросетямОткрыть каталог

Анимированные GIF для Slack

Рисует и собирает короткие GIF и анимированные эмодзи нужного размера и веса для Slack: тряска, пульс, отскок, зум.

СкиллAnthropicClaudeApache-2.0Нужен терминалПроверка не требуется
Что делает
Рисует и собирает короткие GIF и анимированные эмодзи нужного размера и веса для Slack: тряска, пульс, отскок, зум.
Когда брать
Когда нужен GIF или анимированный эмодзи для Slack по описанию или по загруженной картинке.
Когда не брать
Если нужен GIF не для Slack или полноценное видео.
Пример запроса
Сделай GIF-эмодзи для Slack: сердце, которое пульсирует и искрится.
Нужно подключить
Python

Как включить

  1. Скачайте архив и распакуйте его.
  2. Положите папку slack-gif-creator в ~/.claude/skills/.
  3. Откройте Claude Code и опишите задачу своими словами: Claude подхватит скилл по описанию.

Текст

---
name: slack-gif-creator
description: Знания и утилиты для создания анимированных GIF, оптимизированных для Slack. Даёт ограничения, инструменты проверки и приёмы анимации. Используй, когда пользователь просит анимированные GIF для Slack, например «сделай мне GIF, где X делает Y, для Slack».
license: Complete terms in LICENSE.txt
---

Slack GIF Creator

Набор утилит и знаний для создания анимированных GIF, оптимизированных для Slack.

Требования Slack

Размеры:

  • GIF-эмодзи: 128x128 (рекомендуется)
  • GIF в сообщениях: 480x480

Параметры:

  • FPS: 10–30 (чем меньше, тем меньше размер файла)
  • Цвета: 48–128 (чем меньше, тем меньше размер файла)
  • Длительность: для GIF-эмодзи не больше 3 секунд

Основной порядок работы

from core.gif_builder import GIFBuilder
from PIL import Image, ImageDraw

# 1. Create builder
builder = GIFBuilder(width=128, height=128, fps=10)

# 2. Generate frames
for i in range(12):
    frame = Image.new('RGB', (128, 128), (240, 248, 255))
    draw = ImageDraw.Draw(frame)

    # Draw your animation using PIL primitives
    # (circles, polygons, lines, etc.)

    builder.add_frame(frame)

# 3. Save with optimization
builder.save('output.gif', num_colors=48, optimize_for_emoji=True)

Рисование графики

Работа с изображениями, которые загрузил пользователь

Если пользователь загрузил изображение, пойми, чего он хочет:

  • Использовать его как есть (например, «анимируй это», «разбей это на кадры»)
  • Взять его как вдохновение (например, «сделай что-нибудь похожее»)

Загружай изображения и работай с ними через PIL:

from PIL import Image

uploaded = Image.open('file.png')
# Use directly, or just as reference for colors/style

Рисование с нуля

Когда рисуешь графику с нуля, используй примитивы PIL ImageDraw:

from PIL import ImageDraw

draw = ImageDraw.Draw(frame)

# Circles/ovals
draw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)

# Stars, triangles, any polygon
points = [(x1, y1), (x2, y2), (x3, y3), ...]
draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)

# Lines
draw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5)

# Rectangles
draw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)

Не используй: шрифты с эмодзи (на разных платформах они работают ненадёжно) и не рассчитывай, что в этом скилле есть готовая графика.

Как сделать графику красивой

Графика должна выглядеть аккуратно и творчески, а не примитивно. Для этого:

Используй более толстые линии: для контуров и линий всегда ставь width=2 или больше. Тонкие линии (width=1) выглядят рваными и любительскими.

Добавляй визуальную глубину:

  • Делай фон градиентом (create_gradient_background)
  • Накладывай друг на друга несколько фигур для сложности (например, звезду с маленькой звездой внутри)

Делай фигуры интереснее:

  • Не рисуй просто круг: добавь блики, кольца или узоры
  • У звёзд может быть свечение (нарисуй позади более крупные полупрозрачные копии)
  • Комбинируй несколько фигур (звёзды и искры, круги и кольца)

Следи за цветами:

  • Бери яркие, дополняющие друг друга цвета
  • Добавляй контраст (тёмные контуры на светлых фигурах, светлые контуры на тёмных)
  • Думай о композиции в целом

Для сложных фигур (сердца, снежинки и т. п.):

  • Используй сочетания многоугольников и эллипсов
  • Точно рассчитывай точки, чтобы сохранить симметрию
  • Добавляй детали (у сердца может быть изогнутый блик, у снежинок — сложные ответвления)

Будь изобретателен и внимателен к деталям! Хороший GIF для Slack должен выглядеть аккуратно, а не как временная заглушка.

Доступные утилиты

GIFBuilder (core.gif_builder)

Собирает кадры и оптимизирует их для Slack:

builder = GIFBuilder(width=128, height=128, fps=10)
builder.add_frame(frame)  # Add PIL Image
builder.add_frames(frames)  # Add list of frames
builder.save('out.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True)

Валидаторы (core.validators)

Проверяют, соответствует ли GIF требованиям Slack:

from core.validators import validate_gif, is_slack_ready

# Detailed validation
passes, info = validate_gif('my.gif', is_emoji=True, verbose=True)

# Quick check
if is_slack_ready('my.gif'):
    print("Ready!")

Функции плавности (core.easing)

Плавное движение вместо линейного:

from core.easing import interpolate

# Progress from 0.0 to 1.0
t = i / (num_frames - 1)

# Apply easing
y = interpolate(start=0, end=400, t=t, easing='ease_out')

# Available: linear, ease_in, ease_out, ease_in_out,
#           bounce_out, elastic_out, back_out

Помощники для кадров (core.frame_composer)

Удобные функции для типовых задач:

from core.frame_composer import (
    create_blank_frame,         # Solid color background
    create_gradient_background,  # Vertical gradient
    draw_circle,                # Helper for circles
    draw_text,                  # Simple text rendering
    draw_star                   # 5-pointed star
)

Приёмы анимации

Тряска и вибрация

Смещай положение объекта колебаниями:

  • Используй math.sin() или math.cos() от номера кадра
  • Добавляй небольшие случайные отклонения для естественности
  • Применяй к позиции по x, по y или по обеим осям

Пульсация и сердцебиение

Ритмично меняй размер объекта:

  • Для плавной пульсации используй math.sin(t * frequency * 2 * math.pi)
  • Для сердцебиения: два быстрых удара, затем пауза (подстрой синусоиду)
  • Масштабируй в пределах от 0,8 до 1,2 от базового размера

Отскок

Объект падает и отскакивает:

  • Для приземления используй interpolate() с easing='bounce_out'
  • Для падения (с ускорением) используй easing='ease_in'
  • Учти гравитацию: увеличивай скорость по y с каждым кадром

Вращение

Вращай объект вокруг центра:

  • В PIL: image.rotate(angle, resample=Image.BICUBIC)
  • Для покачивания бери для угла синусоиду вместо линейного изменения

Появление и исчезание

Плавно появляйся или исчезай:

  • Создай RGBA-изображение и меняй альфа-канал
  • Или используй Image.blend(image1, image2, alpha)
  • Появление: alpha от 0 до 1
  • Исчезание: alpha от 1 до 0

Выезд

Двигай объект из-за границ кадра на его место:

  • Начальная позиция: за пределами кадра
  • Конечная позиция: целевое место
  • Для плавной остановки используй interpolate() с easing='ease_out'
  • Для «перелёта» с возвратом используй easing='back_out'

Приближение

Масштабируй и смещай объект для эффекта зума:

  • Приближение: масштаб от 0,1 до 2,0, обрезка по центру
  • Отдаление: масштаб от 2,0 до 1,0
  • Для драматичности можно добавить размытие движения (фильтр PIL)

Взрыв и разлёт частиц

Создай частицы, разлетающиеся в стороны:

  • Генерируй частицы со случайными углами и скоростями
  • Обновляй каждую частицу: x += vx, y += vy
  • Добавь гравитацию: vy += gravity_constant
  • Постепенно гаси частицы (уменьшай alpha)

Способы оптимизации

Если просят уменьшить размер файла, примени несколько из этих способов:

  1. Меньше кадров — снизь FPS (10 вместо 20) или сократи длительность
  2. Меньше цветов — num_colors=48 вместо 128
  3. Меньше размеры — 128x128 вместо 480x480
  4. Убери дубликаты — remove_duplicates=True в save()
  5. Режим эмодзи — optimize_for_emoji=True оптимизирует автоматически
# Maximum optimization for emoji
builder.save(
    'emoji.gif',
    num_colors=48,
    optimize_for_emoji=True,
    remove_duplicates=True
)

Философия

Этот скилл даёт:

  • Знания: требования Slack и приёмы анимации
  • Утилиты: GIFBuilder, валидаторы, функции плавности
  • Свободу: логику анимации ты создаёшь сам из примитивов PIL

Этот скилл НЕ даёт:

  • Жёстких шаблонов анимации и готовых функций
  • Отрисовки шрифтов с эмодзи (на разных платформах она работает ненадёжно)
  • Библиотеки готовой графики, встроенной в скилл

О файлах, которые загрузил пользователь: в этом скилле нет готовой графики, но если пользователь загрузил изображение, загрузи и обработай его через PIL. По смыслу просьбы определи, нужно ли использовать его как есть или только как источник вдохновения.

Будь изобретателен! Сочетай приёмы (отскок с вращением, пульсацию с выездом и т. п.) и используй все возможности PIL.

Зависимости

pip install pillow imageio numpy

Перевод: iiuniversitet. Оригинал: https://github.com/anthropics/skills/tree/main/skills/slack-gif-creator, лицензия Apache-2.0. Изменения: перевод на русский язык.

Оригинал на английском
---
name: slack-gif-creator
description: Knowledge and utilities for creating animated GIFs optimized for Slack. Provides constraints, validation tools, and animation concepts. Use when users request animated GIFs for Slack like "make me a GIF of X doing Y for Slack."
license: Complete terms in LICENSE.txt
---

# Slack GIF Creator

A toolkit providing utilities and knowledge for creating animated GIFs optimized for Slack.

## Slack Requirements

**Dimensions:**
- Emoji GIFs: 128x128 (recommended)
- Message GIFs: 480x480

**Parameters:**
- FPS: 10-30 (lower is smaller file size)
- Colors: 48-128 (fewer = smaller file size)
- Duration: Keep under 3 seconds for emoji GIFs

## Core Workflow

```python
from core.gif_builder import GIFBuilder
from PIL import Image, ImageDraw

# 1. Create builder
builder = GIFBuilder(width=128, height=128, fps=10)

# 2. Generate frames
for i in range(12):
    frame = Image.new('RGB', (128, 128), (240, 248, 255))
    draw = ImageDraw.Draw(frame)

    # Draw your animation using PIL primitives
    # (circles, polygons, lines, etc.)

    builder.add_frame(frame)

# 3. Save with optimization
builder.save('output.gif', num_colors=48, optimize_for_emoji=True)
```

## Drawing Graphics

### Working with User-Uploaded Images
If a user uploads an image, consider whether they want to:
- **Use it directly** (e.g., "animate this", "split this into frames")
- **Use it as inspiration** (e.g., "make something like this")

Load and work with images using PIL:
```python
from PIL import Image

uploaded = Image.open('file.png')
# Use directly, or just as reference for colors/style
```

### Drawing from Scratch
When drawing graphics from scratch, use PIL ImageDraw primitives:

```python
from PIL import ImageDraw

draw = ImageDraw.Draw(frame)

# Circles/ovals
draw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)

# Stars, triangles, any polygon
points = [(x1, y1), (x2, y2), (x3, y3), ...]
draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)

# Lines
draw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5)

# Rectangles
draw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)
```

**Don't use:** Emoji fonts (unreliable across platforms) or assume pre-packaged graphics exist in this skill.

### Making Graphics Look Good

Graphics should look polished and creative, not basic. Here's how:

**Use thicker lines** - Always set `width=2` or higher for outlines and lines. Thin lines (width=1) look choppy and amateurish.

**Add visual depth**:
- Use gradients for backgrounds (`create_gradient_background`)
- Layer multiple shapes for complexity (e.g., a star with a smaller star inside)

**Make shapes more interesting**:
- Don't just draw a plain circle - add highlights, rings, or patterns
- Stars can have glows (draw larger, semi-transparent versions behind)
- Combine multiple shapes (stars + sparkles, circles + rings)

**Pay attention to colors**:
- Use vibrant, complementary colors
- Add contrast (dark outlines on light shapes, light outlines on dark shapes)
- Consider the overall composition

**For complex shapes** (hearts, snowflakes, etc.):
- Use combinations of polygons and ellipses
- Calculate points carefully for symmetry
- Add details (a heart can have a highlight curve, snowflakes have intricate branches)

Be creative and detailed! A good Slack GIF should look polished, not like placeholder graphics.

## Available Utilities

### GIFBuilder (`core.gif_builder`)
Assembles frames and optimizes for Slack:
```python
builder = GIFBuilder(width=128, height=128, fps=10)
builder.add_frame(frame)  # Add PIL Image
builder.add_frames(frames)  # Add list of frames
builder.save('out.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True)
```

### Validators (`core.validators`)
Check if GIF meets Slack requirements:
```python
from core.validators import validate_gif, is_slack_ready

# Detailed validation
passes, info = validate_gif('my.gif', is_emoji=True, verbose=True)

# Quick check
if is_slack_ready('my.gif'):
    print("Ready!")
```

### Easing Functions (`core.easing`)
Smooth motion instead of linear:
```python
from core.easing import interpolate

# Progress from 0.0 to 1.0
t = i / (num_frames - 1)

# Apply easing
y = interpolate(start=0, end=400, t=t, easing='ease_out')

# Available: linear, ease_in, ease_out, ease_in_out,
#           bounce_out, elastic_out, back_out
```

### Frame Helpers (`core.frame_composer`)
Convenience functions for common needs:
```python
from core.frame_composer import (
    create_blank_frame,         # Solid color background
    create_gradient_background,  # Vertical gradient
    draw_circle,                # Helper for circles
    draw_text,                  # Simple text rendering
    draw_star                   # 5-pointed star
)
```

## Animation Concepts

### Shake/Vibrate
Offset object position with oscillation:
- Use `math.sin()` or `math.cos()` with frame index
- Add small random variations for natural feel
- Apply to x and/or y position

### Pulse/Heartbeat
Scale object size rhythmically:
- Use `math.sin(t * frequency * 2 * math.pi)` for smooth pulse
- For heartbeat: two quick pulses then pause (adjust sine wave)
- Scale between 0.8 and 1.2 of base size

### Bounce
Object falls and bounces:
- Use `interpolate()` with `easing='bounce_out'` for landing
- Use `easing='ease_in'` for falling (accelerating)
- Apply gravity by increasing y velocity each frame

### Spin/Rotate
Rotate object around center:
- PIL: `image.rotate(angle, resample=Image.BICUBIC)`
- For wobble: use sine wave for angle instead of linear

### Fade In/Out
Gradually appear or disappear:
- Create RGBA image, adjust alpha channel
- Or use `Image.blend(image1, image2, alpha)`
- Fade in: alpha from 0 to 1
- Fade out: alpha from 1 to 0

### Slide
Move object from off-screen to position:
- Start position: outside frame bounds
- End position: target location
- Use `interpolate()` with `easing='ease_out'` for smooth stop
- For overshoot: use `easing='back_out'`

### Zoom
Scale and position for zoom effect:
- Zoom in: scale from 0.1 to 2.0, crop center
- Zoom out: scale from 2.0 to 1.0
- Can add motion blur for drama (PIL filter)

### Explode/Particle Burst
Create particles radiating outward:
- Generate particles with random angles and velocities
- Update each particle: `x += vx`, `y += vy`
- Add gravity: `vy += gravity_constant`
- Fade out particles over time (reduce alpha)

## Optimization Strategies

Only when asked to make the file size smaller, implement a few of the following methods:

1. **Fewer frames** - Lower FPS (10 instead of 20) or shorter duration
2. **Fewer colors** - `num_colors=48` instead of 128
3. **Smaller dimensions** - 128x128 instead of 480x480
4. **Remove duplicates** - `remove_duplicates=True` in save()
5. **Emoji mode** - `optimize_for_emoji=True` auto-optimizes

```python
# Maximum optimization for emoji
builder.save(
    'emoji.gif',
    num_colors=48,
    optimize_for_emoji=True,
    remove_duplicates=True
)
```

## Philosophy

This skill provides:
- **Knowledge**: Slack's requirements and animation concepts
- **Utilities**: GIFBuilder, validators, easing functions
- **Flexibility**: Create the animation logic using PIL primitives

It does NOT provide:
- Rigid animation templates or pre-made functions
- Emoji font rendering (unreliable across platforms)
- A library of pre-packaged graphics built into the skill

**Note on user uploads**: This skill doesn't include pre-built graphics, but if a user uploads an image, use PIL to load and work with it - interpret based on their request whether they want it used directly or just as inspiration.

Be creative! Combine concepts (bouncing + rotating, pulsing + sliding, etc.) and use PIL's full capabilities.

## Dependencies

```bash
pip install pillow imageio numpy
```

Источник: anthropics/skills / slack-gif-creator ↗. Ссылка проверена 2026-10-10.