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 GIF | 128×128 | 推荐尺寸,用于自定义表情 |
| 消息 GIF | 480×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_out4.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_angle5.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 numpy9. 本节小结
| 要点 | 说明 |
|---|---|
| 尺寸规格 | Emoji 128×128,消息 480×480 |
| 性能优化 | 低 FPS、少颜色、短时长 |
| PIL 绘图 | 使用粗线条、增加视觉深度 |
| 动画组合 | 可混合使用多种动画效果 |
| 验证工具 | 发布前检查是否符合 Slack 要求 |
返回:Skills 目录