mcpField
A
animated-message-composer

animated-message-composer

github.com/qodex-ai创意与媒体47133 次安装42 周前更新
代码仓库

关于 animated-message-composer

用于制作适配 Slack 的动画 GIF 的工具集与指南,结合帧构建、规格校验、视觉效果和动画模板,面向需要制作自定义图像的用户。

主要功能

  1. 01根据图像帧构建 GIF
  2. 02校验 Slack GIF 要求
  3. 03应用缓动和视觉效果
  4. 04使用现成动画模板
  5. 05借助 PIL 工具绘制图形
  6. 06优化文件大小和颜色

适用场景

  1. 01制作自定义 Slack 表情动画
  2. 02创建 Slack 消息 GIF
  3. 03检查 GIF 是否符合 Slack 规范
  4. 04为上传的图像添加动画

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/qodex-ai/ai-agent-skills --skill animated-message-composer

安装后在 Claude Code 中输入/animated-message-composer确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE.txt
requirements.txt
core/
color_palettes.py
easing.py
frame_composer.py
gif_builder.py
typography.py
validators.py
visual_effects.py
templates/
bounce.py
explode.py
fade.py
flip.py
kaleidoscope.py
morph.py
move.py
pulse.py
shake.py
slide.py
spin.py
wiggle.py
zoom.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)

优化策略

只有在用户要求减小文件大小时,才实施以下几种方法:

  1. 减少帧数 - 降低 FPS(例如 10,而非 20)或缩短时长
  2. 减少颜色数 - 使用 num_colors=48,而非 128
  3. 缩小尺寸 - 使用 128x128,而非 480x480
  4. 移除重复帧 - 在 save() 中设置 remove_duplicates=True
  5. 表情符号模式 - 设置 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

评论

支持 Markdown