SlackGIF制作工具包 slack-gif-creator

Slack GIF 制作工具包是一个用于创建和优化 Slack 平台动画 GIF 的 Python 工具包。它提供验证器来确保符合 Slack 的大小和尺寸限制,以及可组合的动画原语如摇动、弹跳、移动等,帮助用户轻松制作动画 GIF 和表情。关键词:Slack GIF 制作, 动画 GIF 工具包, Python 图像处理, Slack 表情优化, GIF 验证器

其他 0 次安装 0 次浏览 更新于 3/8/2026

name: slack-gif-creator description: Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives. This skill applies when users request animated GIFs or emoji animations for Slack from descriptions like “make me a GIF for Slack of X doing Y”. license: Complete terms in LICENSE.txt

Slack GIF 创建器 - 灵活工具包

一个用于创建 Slack 优化的动画 GIF 的工具包。提供 Slack 约束的验证器、可组合的动画原语和可选的帮助工具。根据需要应用这些工具来实现创意愿景。

Slack 的要求

Slack 根据使用有特定的 GIF 要求:

消息 GIFs:

  • 最大尺寸: ~2MB
  • 最佳尺寸: 480x480
  • 典型 FPS: 15-20
  • 颜色限制: 128-256
  • 持续时间: 2-5s

表情 GIFs:

  • 最大尺寸: 64KB (严格限制)
  • 最佳尺寸: 128x128
  • 典型 FPS: 10-12
  • 颜色限制: 32-48
  • 持续时间: 1-2s

表情 GIFs 具有挑战性 - 64KB 限制严格。有助于的策略:

  • 限制总帧数为 10-15
  • 最多使用 32-48 种颜色
  • 设计保持简单
  • 避免渐变
  • 频繁验证文件大小

工具包结构

此技能提供三种类型的工具:

  1. 验证器 - 检查 GIF 是否符合 Slack 的要求
  2. 动画原语 - 可组合的运动构建块(摇动、弹跳、移动、万花筒)
  3. 帮助工具 - 用于常见需求的函数(文本、颜色、效果)

在如何应用这些工具上享有完全创意自由。

核心验证器

为确保 GIF 符合 Slack 约束,使用这些验证器:

from core.gif_builder import GIFBuilder

# 创建 GIF 后,检查是否满足要求
builder = GIFBuilder(width=128, height=128, fps=10)
# ... 根据需要添加帧 ...

# 保存并检查大小
info = builder.save('emoji.gif', num_colors=48, optimize_for_emoji=True)

# 保存方法自动警告如果文件超过限制
# info 字典包含: size_kb, size_mb, frame_count, duration_seconds

文件大小验证器:

from core.validators import check_slack_size

# 检查 GIF 是否符合大小限制
passes, info = check_slack_size('emoji.gif', is_emoji=True)
# 返回: (True/False, 带大小详细信息的字典)

尺寸验证器:

from core.validators import validate_dimensions

# 检查尺寸
passes, info = validate_dimensions(128, 128, is_emoji=True)
# 返回: (True/False, 带尺寸详细信息的字典)

完整验证:

from core.validators import validate_gif, is_slack_ready

# 运行所有验证
all_pass, results = validate_gif('emoji.gif', is_emoji=True)

# 或快速检查
if is_slack_ready('emoji.gif', is_emoji=True):
    print("准备上传!")

动画原语

这些是运动可组合的构建块。应用于任何对象在任何组合中:

摇动

from templates.shake import create_shake_animation

# 摇动表情
frames = create_shake_animation(
    object_type='emoji',
    object_data={'emoji': '😱', 'size': 80},
    num_frames=20,
    shake_intensity=15,
    direction='both'  # 或 'horizontal', 'vertical'
)

弹跳

from templates.bounce import create_bounce_animation

# 弹跳圆圈
frames = create_bounce_animation(
    object_type='circle',
    object_data={'radius': 40, 'color': (255, 100, 100)},
    num_frames=30,
    bounce_height=150
)

旋转

from templates.spin import create_spin_animation, create_loading_spinner

# 顺时针旋转
frames = create_spin_animation(
    object_type='emoji',
    object_data={'emoji': '🔄', 'size': 100},
    rotation_type='clockwise',
    full_rotations=2
)

# 摆动旋转
frames = create_spin_animation(rotation_type='wobble', full_rotations=3)

# 加载旋转器
frames = create_loading_spinner(spinner_type='dots')

脉冲

from templates.pulse import create_pulse_animation, create_attention_pulse

# 平滑脉冲
frames = create_pulse_animation(
    object_data={'emoji': '❤️', 'size': 100},
    pulse_type='smooth',
    scale_range=(0.8, 1.2)
)

# 心跳(双泵)
frames = create_pulse_animation(pulse_type='heartbeat')

# 表情 GIFs 的注意脉冲
frames = create_attention_pulse(emoji='⚠️', num_frames=20)

淡入淡出

from templates.fade import create_fade_animation, create_crossfade

# 淡入
frames = create_fade_animation(fade_type='in')

# 淡出
frames = create_fade_animation(fade_type='out')

# 两个表情之间的交叉淡入淡出
frames = create_crossfade(
    object1_data={'emoji': '😊', 'size': 100},
    object2_data={'emoji': '😂', 'size': 100}
)

缩放

from templates.zoom import create_zoom_animation, create_explosion_zoom

# 戏剧性放大
frames = create_zoom_animation(
    zoom_type='in',
    scale_range=(0.1, 2.0),
    add_motion_blur=True
)

# 缩小
frames = create_zoom_animation(zoom_type='out')

# 爆炸缩放
frames = create_explosion_zoom(emoji='💥')

爆炸

from templates.explode import create_explode_animation, create_particle_burst

# 爆发爆炸
frames = create_explode_animation(
    explode_type='burst',
    num_pieces=25
)

# 粉碎效果
frames = create_explode_animation(explode_type='shatter')

# 溶解成粒子
frames = create_explode_animation(explode_type='dissolve')

# 粒子爆发
frames = create_particle_burst(particle_count=30)

摆动

from templates.wiggle import create_wiggle_animation, create_excited_wiggle

# 果冻摆动
frames = create_wiggle_animation(
    wiggle_type='jello',
    intensity=1.0,
    cycles=2
)

# 波浪运动
frames = create_wiggle_animation(wiggle_type='wave')

# 表情 GIFs 的兴奋摆动
frames = create_excited_wiggle(emoji='🎉')

滑动

from templates.slide import create_slide_animation, create_multi_slide

# 从左侧滑入并超越
frames = create_slide_animation(
    direction='left',
    slide_type='in',
    overshoot=True
)

# 滑过
frames = create_slide_animation(direction='left', slide_type='across')

# 多个对象顺序滑入
objects = [
    {'data': {'emoji': '🎯', 'size': 60}, 'direction': 'left', 'final_pos': (120, 240)},
    {'data': {'emoji': '🎪', 'size': 60}, 'direction': 'right', 'final_pos': (240, 240)}
]
frames = create_multi_slide(objects, stagger_delay=5)

翻转

from templates.flip import create_flip_animation, create_quick_flip

# 两个表情之间的水平翻转
frames = create_flip_animation(
    object1_data={'emoji': '😊', 'size': 120},
    object2_data={'emoji': '😂', 'size': 120},
    flip_axis='horizontal'
)

# 垂直翻转
frames = create_flip_animation(flip_axis='vertical')

# 表情 GIFs 的快速翻转
frames = create_quick_flip('👍', '👎')

变形

from templates.morph import create_morph_animation, create_reaction_morph

# 交叉淡入淡出变形
frames = create_morph_animation(
    object1_data={'emoji': '😊', 'size': 100},
    object2_data={'emoji': '😂', 'size': 100},
    morph_type='crossfade'
)

# 缩放变形(缩小而另一个生长)
frames = create_morph_animation(morph_type='scale')

# 旋转变形(类似 3D 翻转)
frames = create_morph_animation(morph_type='spin_morph')

移动效果

from templates.move import create_move_animation

# 线性移动
frames = create_move_animation(
    object_type='emoji',
    object_data={'emoji': '🚀', 'size': 60},
    start_pos=(50, 240),
    end_pos=(430, 240),
    motion_type='linear',
    easing='ease_out'
)

# 弧线移动(抛物线轨迹)
frames = create_move_animation(
    object_type='emoji',
    object_data={'emoji': '⚽', 'size': 60},
    start_pos=(50, 350),
    end_pos=(430, 350),
    motion_type='arc',
    motion_params={'arc_height': 150}
)

# 圆形移动
frames = create_move_animation(
    object_type='emoji',
    object_data={'emoji': '🌍', 'size': 50},
    motion_type='circle',
    motion_params={
        'center': (240, 240),
        'radius': 120,
        'angle_range': 360  # 全圆
    }
)

# 波浪移动
frames = create_move_animation(
    motion_type='wave',
    motion_params={
        'wave_amplitude': 50,
        'wave_frequency': 2
    }
)

# 或使用低级缓动函数
from core.easing import interpolate, calculate_arc_motion

for i in range(num_frames):
    t = i / (num_frames - 1)
    x = interpolate(start_x, end_x, t, easing='ease_out')
    # 或: x, y = calculate_arc_motion(start, end, height, t)

万花筒效果

from templates.kaleidoscope import apply_kaleidoscope, create_kaleidoscope_animation

# 应用于单帧
kaleido_frame = apply_kaleidoscope(frame, segments=8)

# 或创建动画万花筒
frames = create_kaleidoscope_animation(
    base_frame=my_frame,  # 或 None 用于演示模式
    num_frames=30,
    segments=8,
    rotation_speed=1.0
)

# 简单镜像效果(更快)
from templates.kaleidoscope import apply_simple_mirror

mirrored = apply_simple_mirror(frame, mode='quad')  # 4 向镜像
# 模式: 'horizontal', 'vertical', 'quad', 'radial'

自由组合原语的模式:

# 示例:弹跳 + 摇动以模拟冲击
for i in range(num_frames):
    frame = create_blank_frame(480, 480, bg_color)

    # 弹跳运动
    t_bounce = i / (num_frames - 1)
    y = interpolate(start_y, ground_y, t_bounce, 'bounce_out')

    # 在冲击时添加摇动(当 y 达到地面)
    if y >= ground_y - 5:
        shake_x = math.sin(i * 2) * 10
        x = center_x + shake_x
    else:
        x = center_x

    draw_emoji(frame, '⚽', (x, y), size=60)
    builder.add_frame(frame)

帮助工具

这些是常见需求的可选助手。根据需要使用、修改或替换为自定义实现。

GIF 构建器(组装与优化)

from core.gif_builder import GIFBuilder

# 使用选择的设置创建构建器
builder = GIFBuilder(width=480, height=480, fps=20)

# 添加帧(无论您如何创建它们)
for frame in my_frames:
    builder.add_frame(frame)

# 保存并优化
builder.save('output.gif',
             num_colors=128,
             optimize_for_emoji=False)

关键特性:

  • 自动颜色量化
  • 重复帧移除
  • Slack 限制的大小警告
  • 表情模式(积极优化)

文本渲染

对于像表情这样的小 GIF,文本可读性具有挑战性。常见解决方案包括添加轮廓:

from core.typography import draw_text_with_outline, TYPOGRAPHY_SCALE

# 带轮廓的文本(有助于可读性)
draw_text_with_outline(
    frame, "BONK!",
    position=(240, 100),
    font_size=TYPOGRAPHY_SCALE['h1'],  # 60px
    text_color=(255, 68, 68),
    outline_color=(0, 0, 0),
    outline_width=4,
    centered=True
)

要实现自定义文本渲染,使用 PIL 的 ImageDraw.text(),对于较大的 GIF 效果良好。

颜色管理

专业的 GIF 通常使用协调的颜色调色板:

from core.color_palettes import get_palette

# 获取预制调色板
palette = get_palette('vibrant')  # 或 'pastel', 'dark', 'neon', 'professional'

bg_color = palette['background']
text_color = palette['primary']
accent_color = palette['accent']

要直接处理颜色,使用 RGB 元组 - 根据用例选择。

视觉效果

可选效果用于冲击时刻:

from core.visual_effects import ParticleSystem, create_impact_flash, create_shockwave_rings

# 粒子系统
particles = ParticleSystem()
particles.emit_sparkles(x=240, y=200, count=15)
particles.emit_confetti(x=240, y=200, count=20)

# 每帧更新和渲染
particles.update()
particles.render(frame)

# 闪光效果
frame = create_impact_flash(frame, position=(240, 200), radius=100)

# 冲击波环
frame = create_shockwave_rings(frame, position=(240, 200), radii=[30, 60, 90])

缓动函数

平滑运动使用缓动而非线性插值:

from core.easing import interpolate

# 物体下落(加速)
y = interpolate(start=0, end=400, t=progress, easing='ease_in')

# 物体着陆(减速)
y = interpolate(start=0, end=400, t=progress, easing='ease_out')

# 弹跳
y = interpolate(start=0, end=400, t=progress, easing='bounce_out')

# 超越(弹性)
scale = interpolate(start=0.5, end=1.0, t=progress, easing='elastic_out')

可用缓动:linear, ease_in, ease_out, ease_in_out, bounce_out, elastic_out, back_out(超越),更多在 core/easing.py

帧合成

如果需要,基本绘制工具:

from core.frame_composer import (
    create_gradient_background,  # 渐变背景
    draw_emoji_enhanced,         # 带阴影的表情
    draw_circle_with_shadow,     # 带深度的形状
    draw_star                    # 五角星
)

# 渐变背景
frame = create_gradient_background(480, 480, top_color, bottom_color)

# 带阴影的表情
draw_emoji_enhanced(frame, '🎉', position=(200, 200), size=80, shadow=True)

优化策略

当 GIF 太大时:

对于消息 GIFs (>2MB):

  1. 减少帧数(降低 FPS 或缩短持续时间)
  2. 减少颜色(128 → 64 种颜色)
  3. 减少尺寸(480x480 → 320x320)
  4. 启用重复帧移除

对于表情 GIFs (>64KB) - 积极操作:

  1. 限制总帧数为 10-12
  2. 最多使用 32-40 种颜色
  3. 避免渐变(纯色压缩更好)
  4. 简化设计(元素较少)
  5. 在保存方法中使用 optimize_for_emoji=True

示例合成模式

简单反应(脉动)

builder = GIFBuilder(128, 128, 10)

for i in range(12):
    frame = Image.new('RGB', (128, 128), (240, 248, 255))

    # 脉动比例
    scale = 1.0 + math.sin(i * 0.5) * 0.15
    size = int(60 * scale)

    draw_emoji_enhanced(frame, '😱', position=(64-size//2, 64-size//2),
                       size=size, shadow=False)
    builder.add_frame(frame)

builder.save('reaction.gif', num_colors=40, optimize_for_emoji=True)

# 验证
from core.validators import check_slack_size
check_slack_size('reaction.gif', is_emoji=True)

带冲击动作(弹跳 + 闪光)

builder = GIFBuilder(480, 480, 20)

# 阶段 1:物体下落
for i in range(15):
    frame = create_gradient_background(480, 480, (240, 248, 255), (200, 230, 255))
    t = i / 14
    y = interpolate(0, 350, t, 'ease_in')
    draw_emoji_enhanced(frame, '⚽', position=(220, int(y)), size=80)
    builder.add_frame(frame)

# 阶段 2:冲击 + 闪光
for i in range(8):
    frame = create_gradient_background(480, 480, (240, 248, 255), (200, 230, 255))

    # 前几帧闪光
    if i < 3:
        frame = create_impact_flash(frame, (240, 350), radius=120, intensity=0.6)

    draw_emoji_enhanced(frame, '⚽', position=(220, 350), size=80)

    # 文本出现
    if i > 2:
        draw_text_with_outline(frame, "GOAL!", position=(240, 150),
                              font_size=60, text_color=(255, 68, 68),
                              outline_color=(0, 0, 0), outline_width=4, centered=True)

    builder.add_frame(frame)

builder.save('goal.gif', num_colors=128)

组合原语(移动 + 摇动)

from templates.shake import create_shake_animation

# 创建摇动动画
shake_frames = create_shake_animation(
    object_type='emoji',
    object_data={'emoji': '😰', 'size': 70},
    num_frames=20,
    shake_intensity=12
)

# 创建触发摇动的移动元素
builder = GIFBuilder(480, 480, 20)
for i in range(40):
    t = i / 39

    if i < 20:
        # 触发前 - 使用空白帧和移动对象
        frame = create_blank_frame(480, 480, (255, 255, 255))
        x = interpolate(50, 300, t * 2, 'linear')
        draw_emoji_enhanced(frame, '🚗', position=(int(x), 300), size=60)
        draw_emoji_enhanced(frame, '😰', position=(350, 200), size=70)
    else:
        # 触发后 - 使用摇动帧
        frame = shake_frames[i - 20]
        # 在最终位置添加车
        draw_emoji_enhanced(frame, '🚗', position=(300, 300), size=60)

    builder.add_frame(frame)

builder.save('scare.gif')

理念

此工具包提供构建块,而非固定配方。处理 GIF 请求时:

  1. 理解创意愿景 - 应该发生什么?氛围如何?
  2. 设计动画 - 分解为阶段(预期、动作、反应)
  3. 根据需要应用原语 - 摇动、弹跳、移动、效果 - 自由混合
  4. 验证约束 - 检查文件大小,特别是表情 GIFs
  5. 如果需要迭代 - 减少帧数/颜色如果超过大小限制

目标是在 Slack 技术约束内实现创意自由。

依赖项

要使用此工具包,仅当未安装时安装这些依赖项:

pip install pillow imageio numpy