Slack GIF 生成器
Slack GIF 创建工具
一个提供实用工具和知识库的工具包,用于创建针对 Slack 优化的动画 GIF。
Slack 要求
尺寸:
- 表情符号 (Emoji) GIF:128x128(推荐)
- 消息 GIF:480x480
参数:
- FPS:10-30(越低文件越小)
- 颜色数:48-128(越少文件越小)
- 时长:表情符号 GIF 请保持在 3 秒以内
核心工作流
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)绘制图形
处理用户上传的图像
如果用户上传了图像,请考虑其意图:- 直接使用(例如:“让这个动起来”、“将其拆分为帧”)
- 作为灵感(例如:“做一个类似这样的”)
使用 PIL 加载并处理图像:
from PIL import Image
uploaded = Image.open('file.png')
直接使用,或仅将其作为颜色/风格的参考
从零开始绘制
从零开始绘制图形时,请使用 PILImageDraw 原语:
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 或更高。细线(width=1)看起来会有锯齿感且显得业余。
增加视觉深度:
- 为背景使用渐变色 (
create_gradient_background)
- 通过叠加多个形状增加复杂度(例如,在大星形内部绘制一个小星形)
让形状更有趣:
- 不要只画一个简单的圆 —— 添加高光、圆环或图案
- 星形可以添加光晕(在背后绘制较大的半透明版本)
- 组合多种形状(星形 + 闪烁点,圆形 + 圆环)
注重色彩搭配:
- 使用鲜艳且互补的颜色
- 增加对比度(浅色形状用深色轮廓,深色形状用浅色轮廓)
- 考虑整体构图
对于复杂形状(心形、雪花等):
- 结合使用多边形和椭圆
- 精确计算坐标点以保证对称
- 添加细节(例如心形可以有高光曲线,雪花可以有复杂的分叉)
发挥创意并注重细节!一个优秀的 Slack GIF 应该看起来像经过精心设计的作品,而不是占位符图形。
可用实用工具
GIFBuilder (core.gif_builder)
组装帧并针对 Slack 进行优化:
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)Validators (core.validators)
检查 G
如果符合 Slack 要求:
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!")缓动函数 (core.easing)
实现平滑运动而非线性运动:
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
帧辅助函数 (core.frame_composer)
满足常用需求的便捷函数:
from core.frame_composer import (
create_blank_frame, # 纯色背景
create_gradient_background, # 垂直渐变
draw_circle, # 圆形辅助函数
draw_text, # 简单文本渲染
draw_star # 五角星
)动画概念
抖动/震动 (Shake/Vibrate)
通过振荡偏移对象位置:- 结合帧索引使用
math.sin()或math.cos()
- 添加微小的随机变化以增加自然感
- 应用于 x 轴和/或 y 轴位置
脉冲/心跳 (Pulse/Heartbeat)
有节奏地缩放对象大小:- 使用
math.sin(t * frequency * 2 * math.pi)实现平滑脉冲
- 心跳效果:两次快速脉冲后暂停(调整正弦波)
- 在基础大小的 0.8 到 1.2 之间缩放
弹跳 (Bounce)
对象下落并反弹:- 着陆时使用
interpolate()且easing='bounce_out'
- 下落(加速)时使用
easing='ease_in'
- 通过每帧增加 y 轴速度来模拟重力
旋转 (Spin/Rotate)
对象绕中心旋转:- PIL:
image.rotate(angle, resample=Image.BICUBIC)
- 摇摆效果:角度使用正弦波而非线性增加
淡入/淡出 (Fade In/Out)
逐渐出现或消失:- 创建 RGBA 图像,调整 alpha 通道
- 或使用
Image.blend(image1, image2, alpha)
- 淡入:alpha 从 0 变为 1
- 淡出:alpha 从 1 变为 0
滑动 (Slide)
对象从屏幕外移动到指定位置:- 起始位置:在画布边界之外
- 结束位置:目标位置
- 使用
interpolate()且easing='ease_out'实现平滑停止
- 超出目标位置效果:使用
easing='back_out'
缩放 (Zoom)
通过缩放和定位实现缩放效果:- 放大:缩放比例从 0.1 变为 2.0,裁剪中心
- 缩小:缩放比例从 2.0 变为 1.0
- 可添加运动模糊增加戏剧感(使用 PIL 滤镜)
爆炸/粒子迸发 (Explode/Particle Burst)
创建向外辐射的粒子:- 生成具有随机角度和速度的粒子
- 更新每个粒子:
x += vx,y += vy
- 添加重力:
vy += gravity_constant
- 粒子随时间淡出(降低 alpha 值)
优化策略
仅在被要求减小文件大小时,实施以下几种方法:
1. 减少帧数 - 降低 FPS(例如 10 而非 20)或缩短时长
2. 减少颜色数 - num_colors=48 而非 128
3. 减小尺寸 - 128x128 而非 480x480
4. 移除重复帧 - 在 save() 中设置 remove_duplicates=True
5. Emoji 模式 - optimize_for_emoji=True 自动优化
# 针对 emoji 的最大化优化
builder.save(
'emoji.gif',
num_colors=48,
optimize_for_emoji=True,
remove_duplicates=True
)设计理念
本技能提供:
- 知识:Slack 的要求和动画概念
- 工具:GIFBuilder、验证器、缓动函数
- 灵活性:使用 PIL 原语创建动画逻辑
本技能不提供:
- 僵化的动画模板或预制件
功能
- Emoji 字体渲染(跨平台兼容性较差)
- 技能内置的预装图形库
关于用户上传的说明:本技能不包含预置图形,但如果用户上传了图片,请使用 PIL 进行加载和处理 —— 根据用户请求判断其是希望直接使用该图片,还是仅将其作为灵感参考。
大胆发挥创意!尝试组合多种概念(如:弹跳 + 旋转,脉冲 + 滑动等),并充分利用 PIL 的所有功能。
依赖项
pip install pillow imageio numpy