SuperAPI AI 工具集

slack-gif-creator

设计与创作

查看项目

更新于 10-16 07:46

技能介绍

用途

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