用途
slack-gif-creator 是一个工具包,提供用于创建针对 Slack 优化的动画 GIF 所需的知识与实用工具。它面向需要在 Slack 场景中生成动画 GIF 的用户,给出 Slack 的尺寸与参数约束、校验工具以及动画概念。
Slack 要求
文档列出了 Slack 对 GIF 的明确约束:
尺寸:Emoji GIF 为 128x128(推荐);消息 GIF 为 480x480。
参数:FPS 为 10-30(越低文件越小);颜色数为 48-128(越少文件越小);Emoji GIF 时长保持在 3 秒以内。
主要能力
GIFBuilder(core.gif_builder)
组装帧并针对 Slack 优化,支持 add_frame、add_frames、save 等方法。示例:
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)
保存方法支持参数:num_colors、optimize_for_emoji、remove_duplicates。
Validators(core.validators)
用于检查 GIF 是否满足 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!")
Easing Functions(core.easing)
用于实现平滑运动而非线性运动,通过 interpolate 函数设置 easing 参数,可选项包括:linear、ease_in、ease_out、ease_in_out、bounce_out、elastic_out、back_out。
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')
Frame Helpers(core.frame_composer)
提供常见需求的便捷函数,包括 create_blank_frame(纯色背景)、create_gradient_background(垂直渐变)、draw_circle(画圆辅助)、draw_text(简单文字渲染)、draw_star(五角星)。
使用方式
绘图:处理用户上传的图片
当用户上传图片时,需判断其意图:直接使用(如“让这张图动起来”“把它拆成帧”)或作为灵感(如“做类似这样的东西”)。使用 PIL 加载与处理:
from PIL import Image
uploaded = Image.open('file.png')
# 直接使用,或仅作为颜色/风格参考
绘图:从零开始绘制
使用 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)
文档明确不建议使用 Emoji 字体(跨平台不可靠),也不假定本技能中存在预打包图形。
让图形更精致
文档给出了提升观感的建议:使用更粗的线条(宽度设置为 2 或以上);增加视觉深度(背景使用渐变、层叠多个形状);让形状更有趣(为圆加高光、环或图案;星形可加辉光;组合多种形状);注意颜色(使用鲜艳互补色、增加对比、考虑整体构图);复杂形状(心形、雪花等)使用多边形与椭圆的组合,仔细计算点以保证对称,并添加细节。
动画概念
文档列出了以下动画概念及其实现要点:
抖动/振动:用帧索引配合 math.sin() 或 math.cos() 偏移对象位置,加入小的随机变化使其自然,应用于 x 和/或 y 位置。
脉冲/心跳:用 math.sin(t * frequency * 2 * math.pi) 实现平滑脉冲,心跳为两次快速脉冲后暂停,尺寸在基准的 0.8 到 1.2 之间缩放。
弹跳:落地时使用 easing='bounce_out',下落时使用 easing='ease_in',每帧增加 y 速度以体现重力。
旋转:用 image.rotate(angle, resample=Image.BICUBIC) 绕中心旋转,摆动时角度使用正弦波而非线性。
淡入/淡出:创建 RGBA 图像并调整 alpha 通道,或使用 Image.blend(image1, image2, alpha),淡入 alpha 从 0 到 1,淡出从 1 到 0。
滑动:起始位置在画面边界之外,结束位置为目标位置,使用 easing='ease_out' 实现平滑停止,使用 easing='back_out' 实现过冲。
缩放:放大为从 0.1 缩放到 2.0 并裁剪中心,缩小为从 2.0 缩放到 1.0,可加运动模糊增强戏剧性。
爆炸/粒子迸发:用随机角度和速度生成粒子,每帧更新粒子位置(x += vx,y += vy),加入重力(vy += gravity_constant),随时间降低 alpha 淡出粒子。
优化策略
文档说明:仅在要求减小文件大小时,实施以下方法中的若干项:减少帧数(用 10 FPS 而非 20,或缩短时长);减少颜色数(num_colors=48 而非 128);缩小尺寸(128x128 而非 480x480);去重(save() 中 remove_duplicates=True);Emoji 模式(optimize_for_emoji=True 自动优化)。最大优化示例如下:
builder.save(
'emoji.gif',
num_colors=48,
optimize_for_emoji=True,
remove_duplicates=True
)
适用场景
适用于需要为 Slack 创建 Emoji GIF 或消息 GIF 的场景,尤其是希望遵循 Slack 尺寸、帧率、颜色数和时长约束并使用 Python/PIL 编写动画逻辑的用户。
限制
该技能提供的是知识(Slack 要求与动画概念)与实用工具(GIFBuilder、校验器、缓动函数),动画逻辑需使用 PIL 原语自行创建。它不提供固定动画模板或现成函数,不支持 Emoji 字体渲染(跨平台不可靠),也不包含内置的预打包图形库。
依赖
pip install pillow imageio numpy