Skip to content

Slack GIF Creator Skill 详解

创建针对 Slack 优化的动画 GIF

基本信息

属性
名称slack-gif-creator
类别创意设计
输出格式GIF
许可证Apache 2.0
yaml
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."

1. Slack 技术规格

1.1 尺寸要求

用途尺寸说明
Emoji GIF128×128推荐尺寸,用于自定义表情
消息 GIF480×480用于消息内嵌入

1.2 性能参数

markdown
**帧率 (FPS)**:10-30
- 较低 = 文件更小
- 10 FPS 通常足够流畅

**颜色数**:48-128
- 较少 = 文件更小
- 48 色对于简单图形足够

**时长**
- Emoji GIF:建议 < 3 秒
- 消息 GIF:可以更长

2. 核心工作流

2.1 基本创建流程

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

# 1. 创建构建器
builder = GIFBuilder(width=128, height=128, fps=10)

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

    # 使用 PIL 原语绘制动画
    # (圆形、多边形、线条等)

    builder.add_frame(frame)

# 3. 保存并优化
builder.save('output.gif', num_colors=48, optimize_for_emoji=True)

2.2 处理用户上传的图片

python
from PIL import Image

# 加载用户上传的图片
uploaded = Image.open('file.png')

# 根据用户意图处理:
# - "animate this" → 直接使用图片
# - "make something like this" → 作为风格参考

3. PIL 绘图技巧

3.1 基本图形

python
from PIL import ImageDraw

draw = ImageDraw.Draw(frame)

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

# 多边形(星形、三角形等)
points = [(x1, y1), (x2, y2), (x3, y3), ...]
draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)

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

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

3.2 让图形更精美

markdown
**线条粗细**
- 始终设置 width=2 或更高
- width=1 看起来粗糙不专业

**视觉深度**
- 使用渐变背景 (create_gradient_background)
- 多层叠加形状增加复杂度

**形状增强**
- 不只是画普通圆形——添加高光、环形或图案
- 星形可以有发光效果(在后面绘制更大的半透明版本)
- 组合多个形状(星星 + 闪光点)

**色彩搭配**
- 使用鲜艳的互补色
- 增加对比度(浅色形状配深色轮廓)

4. 可用工具库

4.1 GIFBuilder

python
from core.gif_builder import GIFBuilder

builder = GIFBuilder(width=128, height=128, fps=10)
builder.add_frame(frame)      # 添加 PIL Image
builder.add_frames(frames)    # 添加帧列表
builder.save(
    'out.gif',
    num_colors=48,
    optimize_for_emoji=True,
    remove_duplicates=True
)

4.2 验证器

python
from core.validators import validate_gif, is_slack_ready

# 详细验证
passes, info = validate_gif('my.gif', is_emoji=True, verbose=True)

# 快速检查
if is_slack_ready('my.gif'):
    print("Ready!")

4.3 缓动函数

python
from core.easing import interpolate

# 进度从 0.0 到 1.0
t = i / (num_frames - 1)

# 应用缓动
y = interpolate(start=0, end=400, t=t, easing='ease_out')

# 可用缓动:linear, ease_in, ease_out, ease_in_out,
#           bounce_out, elastic_out, back_out

4.4 帧辅助函数

python
from core.frame_composer import (
    create_blank_frame,          # 纯色背景
    create_gradient_background,  # 垂直渐变
    draw_circle,                 # 圆形辅助
    draw_text,                   # 简单文字渲染
    draw_star                    # 五角星
)

5. 动画概念

5.1 震动/振动 (Shake)

python
# 使用 math.sin() 或 math.cos() 配合帧索引
offset_x = math.sin(frame_index * 0.5) * amplitude
offset_y = math.cos(frame_index * 0.5) * amplitude

# 添加小随机变化增加自然感

5.2 脉动/心跳 (Pulse)

python
# 使用正弦波实现平滑脉动
scale = 1.0 + 0.2 * math.sin(t * frequency * 2 * math.pi)

# 心跳效果:两次快速脉动后暂停

5.3 弹跳 (Bounce)

python
# 使用 bounce_out 缓动实现落地效果
y = interpolate(start=0, end=target, t=t, easing='bounce_out')

# 下落时使用 ease_in(加速)

5.4 旋转 (Spin)

python
# PIL 旋转
rotated = image.rotate(angle, resample=Image.BICUBIC)

# 摆动效果:使用正弦波控制角度
angle = math.sin(t * 2 * math.pi) * max_angle

5.5 淡入/淡出 (Fade)

python
# 创建 RGBA 图像,调整 alpha 通道
# 或使用 Image.blend()
blended = Image.blend(image1, image2, alpha)

5.6 滑动 (Slide)

python
# 从屏幕外移动到目标位置
x = interpolate(start=-100, end=target_x, t=t, easing='ease_out')

# 过冲效果
x = interpolate(start=-100, end=target_x, t=t, easing='back_out')

5.7 粒子爆炸 (Explode)

python
# 生成带随机角度和速度的粒子
particles = [
    {'x': cx, 'y': cy, 'vx': random_vx, 'vy': random_vy, 'alpha': 1.0}
    for _ in range(particle_count)
]

# 更新每个粒子
for p in particles:
    p['x'] += p['vx']
    p['y'] += p['vy']
    p['vy'] += gravity  # 添加重力
    p['alpha'] -= 0.05  # 逐渐消失

6. 优化策略

6.1 何时优化

只在用户要求减小文件大小时实施优化:

方法效果
减少帧数FPS 10 代替 20
减少颜色num_colors=48 代替 128
缩小尺寸128×128 代替 480×480
移除重复帧remove_duplicates=True
Emoji 模式optimize_for_emoji=True

6.2 最大优化示例

python
builder.save(
    'emoji.gif',
    num_colors=48,
    optimize_for_emoji=True,
    remove_duplicates=True
)

7. 设计哲学

7.1 Skill 提供什么

markdown
✓ 知识:Slack 的要求和动画概念
✓ 工具:GIFBuilder、验证器、缓动函数
✓ 灵活性:使用 PIL 原语创建动画逻辑

7.2 Skill 不提供什么

markdown
✗ 僵化的动画模板或预制函数
✗ Emoji 字体渲染(跨平台不可靠)
✗ 内置的预包装图形库

7.3 创意原则

markdown
**发挥创意!**
- 组合多种概念(弹跳 + 旋转、脉动 + 滑动等)
- 充分利用 PIL 的全部功能
- 一个好的 Slack GIF 应该看起来精致,而非占位图形

8. 使用示例

8.1 触发方式

"帮我做一个 Slack 表情 GIF"
"创建一个跳动的心形动画"
"make me a GIF of a star spinning for Slack"
"create a bouncing ball emoji"

8.2 依赖安装

bash
pip install pillow imageio numpy

9. 本节小结

要点说明
尺寸规格Emoji 128×128,消息 480×480
性能优化低 FPS、少颜色、短时长
PIL 绘图使用粗线条、增加视觉深度
动画组合可混合使用多种动画效果
验证工具发布前检查是否符合 Slack 要求

返回:Skills 目录

基于 MIT 许可证发布。内容版权归作者所有。