SlackGIF创建工具包 slack-gif-creator

这是一个专门用于创建适用于Slack平台的动画GIF的灵活工具包。它提供验证器来确保GIF符合Slack的大小、尺寸和帧率要求,包括消息GIF(最大2MB,480x480)和表情符号GIF(严格64KB,128x128)。工具包包含可组合的动画原语,如抖动、弹跳、移动、旋转、脉冲、淡入淡出、缩放、爆炸、摇摆、滑动、翻转、变形和万花筒效果,以及辅助实用程序,如文本渲染、颜色管理、视觉效果和缓动函数。用户可以使用Python代码自由组合这些工具,生成高质量、优化过的GIF动画,适合用于消息传递或表情符号。这个技能适合开发人员、设计师和内容创作者,用于快速制作符合Slack技术规范的动画内容。关键词:Slack, GIF, 动画, 工具包, 表情符号, 验证器, 动画原语, Python, 图像处理, 软件开发

0 次安装 0 次浏览 更新于 3/7/2026

名称: slack-gif-creator 描述: 用于创建适用于Slack的动画GIF的工具包,提供尺寸约束验证器和可组合动画原语。当用户请求为Slack制作动画GIF或表情符号动画时,例如“为我制作一个X做Y的Slack GIF”,此技能适用。 许可证: 完整条款见LICENSE.txt

Slack GIF 创建器 - 灵活工具包

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

Slack 的要求

Slack对GIF有基于用途的具体要求:

消息GIF:

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

表情符号GIF:

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

表情符号GIF具有挑战性 - 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)

# save方法会自动警告如果文件超过限制
# 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')

# 表情符号GIF的注意脉冲
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')

# 表情符号GIF的兴奋摇摆
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')

# 表情符号GIF的快速翻转
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')  # 四向镜像
# 模式:'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太大时:

对于消息GIF (>2MB):

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

对于表情符号GIF (>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. 验证约束 - 检查文件大小,特别是表情符号GIF
  5. 如果需要则迭代 - 如果超过大小限制,减少帧数/颜色

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

依赖项

要使用此工具包,如果未安装,请安装这些依赖项:

pip install pillow imageio numpy