关于 animated-message-composer
用于制作适配 Slack 的动画 GIF 的工具集与指南,结合帧构建、规格校验、视觉效果和动画模板,面向需要制作自定义图像的用户。
主要功能
- 01根据图像帧构建 GIF
- 02校验 Slack GIF 要求
- 03应用缓动和视觉效果
- 04使用现成动画模板
- 05借助 PIL 工具绘制图形
- 06优化文件大小和颜色
适用场景
- 01制作自定义 Slack 表情动画
- 02创建 Slack 消息 GIF
- 03检查 GIF 是否符合 Slack 规范
- 04为上传的图像添加动画
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ qodex-ai/ ai-agent-skills --skill animated-message-composer安装后在 Claude Code 中输入/animated-message-composer确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSE.txtrequirements.txtcore/color_palettes.pyeasing.pyframe_composer.pygif_builder.pytypography.pyvalidators.pyvisual_effects.pytemplates/bounce.pyexplode.pyfade.pyflip.pykaleidoscope.pymorph.pymove.pypulse.pyshake.pyslide.pyspin.pywiggle.pyzoom.py详细介绍
Slack GIF 创建器
提供实用工具和知识,帮助创建针对 Slack 优化的动画 GIF。
Slack 要求
表情 GIF(Slack 表情上传):
- 最大大小:64 KB
- 尺寸:建议为 128x128(正方形)
- FPS:10-12
- 颜色数:32-48
- 时长:1-2s
消息 GIF:
- 最大大小:约 2 MB
- 尺寸:通常为 480x480
- FPS:15-20
- 颜色数:128-256
- 时长:2-5s
核心工作流
from core.gif_builder import GIFBuilder
from PIL import Image, ImageDraw
# 1. Create builder
builder = GIFBuilder(width=128, height=128, fps=10)
# 2. Generate frames
for i in range(12):
frame = Image.new('RGB', (128, 128), (240, 248, 255))
draw = ImageDraw.Draw(frame)
# Draw your animation using PIL primitives
# (circles, polygons, lines, etc.)
builder.add_frame(frame)
# 3. Save with optimization
builder.save('output.gif', num_colors=48, optimize_for_emoji=True)
可选快捷方式:使用 templates/ 中的动画模板快速生成帧:
from templates.shake import create_shake_animation
frames = create_shake_animation(
object_type='circle',
object_data={'radius': 30, 'color': (100, 150, 255)},
num_frames=20,
direction='both'
)
builder.add_frames(frames)
绘制图形
处理用户上传的图片
如果用户上传了图片,请考虑他们是想:
- 直接使用图片(例如,“给这张图片制作动画”“将这张图片拆分成帧”)
- 将图片用作灵感(例如,“制作类似这样的内容”)
使用 PIL 加载和处理图片:
from PIL import Image
uploaded = Image.open('file.png')
# Use directly, or just as reference for colors/style
从头开始绘制
从头开始绘制图形时,请使用 PIL ImageDraw 基本图形:
from PIL import ImageDraw
draw = ImageDraw.Draw(frame)
# Circles/ovals
draw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)
# Stars, triangles, any polygon
points = [(x1, y1), (x2, y2), (x3, y3), ...]
draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)
# Lines
draw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5)
# Rectangles
draw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)
避免只依赖表情符号字体:它们因平台而异。如果使用 draw_emoji 或 draw_emoji_enhanced,请预期渲染结果会有差异,并做好通过图形或文字进行调整的准备。
让图形更美观
图形应精致且富有创意,而非简单粗糙。以下是一些建议:
使用较粗的线条 - 轮廓和线条的 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) # Add PIL Image
builder.add_frames(frames) # Add list of frames
builder.save('out.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True)
验证器(core.validators)
检查 GIF 是否符合 Slack 要求:
from core.validators import (
validate_gif,
is_slack_ready,
check_slack_size,
validate_dimensions
)
# Detailed validation
passes, info = validate_gif('my.gif', is_emoji=True, verbose=True)
# Quick check
if is_slack_ready('my.gif'):
print("Ready!")
# Focused checks
passes, info = check_slack_size('my.gif', is_emoji=True)
passes, info = validate_dimensions(128, 128, is_emoji=True)
缓动函数(core.easing)
实现平滑运动,而非线性运动:
from core.easing import interpolate
# Progress from 0.0 to 1.0
t = i / (num_frames - 1)
# Apply easing
y = interpolate(start=0, end=400, t=t, easing='ease_out')
# Available: 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, # Solid color background
create_gradient_background, # Vertical gradient
draw_circle, # Helper for circles
draw_rectangle, # Helper for rectangles
draw_line, # Helper for lines
draw_text, # Simple text rendering
draw_emoji, # Emoji rendering (platform-dependent)
draw_star # 5-pointed star
)
其他辅助工具包括 draw_emoji_enhanced、draw_circle_with_shadow、draw_rounded_rectangle 和 add_vignette。
调色板(core.color_palettes)
精心挑选的调色板和易读配色辅助工具:
from core.color_palettes import get_palette, get_text_color_for_background
palette = get_palette('vibrant')
text_color = get_text_color_for_background(palette['background'])
字体排版(core.typography)
高质量的描边文字或阴影文字:
from core.typography import draw_text_with_outline
draw_text_with_outline(frame, "SALE!", position=(240, 240), font_size=48, centered=True)
视觉效果(core.visual_effects)
粒子、模糊、冲击和运动效果:
from core.visual_effects import ParticleSystem
particles = ParticleSystem()
particles.emit(240, 240, count=20)
动画模板(templates/)
现成动画(抖动、弹跳、旋转、缩放、滑动、淡入淡出、翻转、爆炸等)。
使用这些模板生成帧,然后传入 GIFBuilder。
动画概念
抖动/振动
通过振荡改变对象的位置:
- 使用带帧索引的
math.sin()或math.cos() - 添加少量随机变化,让效果更自然
- 应用于 x 和/或 y 位置
脉动/心跳
有节奏地缩放对象:
- 使用
math.sin(t * frequency * 2 * math.pi)实现平滑脉动 - 心跳效果:快速脉动两次,然后暂停(调整正弦波)
- 缩放范围为基础尺寸的 0.8 到 1.2 倍
弹跳
对象下落并弹起:
- 使用
interpolate(),并将easing='bounce_out'用于着地过程 - 下落时使用
easing='ease_in'(加速) - 每帧增加 y 方向的速度,以模拟重力
旋转
围绕中心旋转对象:
- PIL:
image.rotate(angle, resample=Image.BICUBIC) - 要实现摇晃效果:使用正弦波生成角度,而非线性变化
淡入/淡出
让对象逐渐显现或消失:
- 创建 RGBA 图像并调整 alpha 通道
- 或使用
Image.blend(image1, image2, alpha) - 淡入:alpha 从 0 变为 1
- 淡出:alpha 从 1 变为 0
滑动
将对象从屏幕外移到指定位置:
- 起始位置:在画面边界之外
- 结束位置:目标位置
- 使用
interpolate(),并设置easing='ease_out',实现平滑停止 - 要实现过冲效果:使用
easing='back_out'
缩放
通过缩放和定位实现缩放效果:
- 放大:从 0.1 缩放到 2.0,并裁剪中心区域
- 缩小:从 2.0 缩放到 1.0
- 可以添加运动模糊来增强戏剧效果(PIL 滤镜)
爆炸/粒子喷发
创建向外辐射的粒子:
- 以随机角度和速度生成粒子
- 更新每个粒子:
x += vx、y += vy - 添加重力:
vy += gravity_constant - 随时间让粒子淡出(降低 alpha)
优化策略
只有在用户要求减小文件大小时,才实施以下几种方法:
- 减少帧数 - 降低 FPS(例如 10,而非 20)或缩短时长
- 减少颜色数 - 使用
num_colors=48,而非 128 - 缩小尺寸 - 使用 128x128,而非 480x480
- 移除重复帧 - 在 save() 中设置
remove_duplicates=True - 表情符号模式 - 设置
optimize_for_emoji=True自动优化
# Maximum optimization for emoji
builder.save(
'emoji.gif',
num_colors=48,
optimize_for_emoji=True,
remove_duplicates=True
)
理念
此技能提供:
- 知识:Slack 的要求和动画概念
- 实用工具:GIFBuilder、验证器、缓动函数
- 灵活性:使用 PIL 基础功能创建动画逻辑
此技能不提供:
- 固定的动画模板或预制函数
- 表情符号字体渲染(在不同平台上的表现不可靠)
- 内置于此技能的预打包图形库
关于用户上传内容的说明:此技能不包含预制图形,但如果用户上传图像,可使用 PIL 加载并处理;根据用户的请求判断他们是想直接使用图像,还是仅将其作为灵感。
发挥创意!组合不同概念(弹跳 + 旋转、脉动 + 滑动等),并充分利用 PIL 的功能。
依赖项
pip install pillow imageio numpy