Slack GIF Creator 完整指南
本文档包含创建 Slack GIF 的完整技术细节。如果您是初次接触,建议先阅读 📋 概览。
Slack 规格要求
尺寸规范
| 类型 | 宽度 | 高度 | 推荐用途 |
|---|---|---|---|
| Emoji GIF | 128px | 128px | 自定义 emoji |
| Message GIF | 480px | 480px | 消息中的 GIF |
性能参数
- 帧率 (FPS):10-30(数值越低文件越小)
- 颜色数:48-128(数值越少文件越小)
- 时长:Emoji GIF 建议 ❤️ 秒
核心工作流程
1. 创建 GIF 构建器
from core.gif_builder import GIFBuilder
builder = GIFBuilder(width=128, height=128, fps=10)
2. 生成动画帧
from PIL import Image, ImageDraw
for i in range(12):
frame = Image.new('RGB', (128, 128), (240, 248, 255))
draw = ImageDraw.Draw(frame)
# 绘制图形...
draw.ellipse([30, 30, 98, 98], fill=(255, 100, 100), width=3)
builder.add_frame(frame)
3. 保存并优化
builder.save('output.gif',
num_colors=48,
optimize_for_emoji=True,
remove_duplicates=True)
动画概念库
抖动/振动
import math
offset_x = int(5 * math.sin(i * 0.5))
offset_y = int(5 * math.cos(i * 0.5))
脉冲/心跳
scale = 1.0 + 0.2 * math.sin(t * math.pi * 2)
size = int(base_size * scale)
弹跳
from core.easing import interpolate
y = interpolate(start=0, end=100, t=t, easing='bounce_out')
旋转
angle = (i / num_frames) * 360
rotated = image.rotate(angle, resample=Image.BICUBIC)
淡入淡出
alpha = int(255 * t) # 淡入
alpha = int(255 * (1 - t)) # 淡出
滑动
from core.easing import interpolate
x = interpolate(start=-100, end=64, t=t, easing='ease_out')
缩放
scale = interpolate(start=0.1, end=2.0, t=t, easing='ease_in_out')
爆炸/粒子
# 生成随机角度和速度的粒子
for particle in particles:
particle.x += particle.vx
particle.y += particle.vy
particle.vy += gravity
图形绘制
PIL ImageDraw 原语
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)
让图形看起来专业
使用粗线条 (width ≥ 2):
draw.ellipse([...], width=3) # ✅
draw.ellipse([...], width=1) # ❌ 粗糙
添加视觉深度:
# 渐变背景
from core.frame_composer import create_gradient_background
frame = create_gradient_background(128, 128, (255,200,200), (200,200,255))
# 多层形状
draw_star(frame, size=50, color=(255,215,0))
draw_star(frame, size=30, color=(255,255,100))
可用工具
GIFBuilder
builder = GIFBuilder(width=128, height=128, fps=10)
builder.add_frame(frame)
builder.add_frames(frames)
builder.save('out.gif', num_colors=48, optimize_for_emoji=True)
验证器
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("准备上传!")
缓动函数
from core.easing import interpolate
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
帧辅助函数
from core.frame_composer import (
create_blank_frame,
create_gradient_background,
draw_circle,
draw_text,
draw_star
)
优化策略
仅在需要减小文件大小时使用:
- 降低帧率:10 FPS 而非 20 FPS
- 减少颜色:48 色而非 128 色
- 缩小尺寸:128x128 而非 480x480
- 移除重复:
remove_duplicates=True - Emoji 模式:
optimize_for_emoji=True