slack-gif-creator
为 Slack 优化的动画 GIF 生成器。
评分明细
适用场景
slack-gif-creator 快速入门
让 AI 直接给你生成”Slack 表情包”或”小动图”,团队群里活跃气氛 0 门槛。
这是什么?解决什么问题?
远程团队最缺的就是”梗”和”小表情”。但凡用过 Slack/Discord 的人都知道,真正能爆火的是那种几 KB、128x128、3 帧循环的小 GIF,做起来却要会 PS/AE/FFmpeg,门槛不低。
slack-gif-creator 是 Anthropic 官方 skills 仓库里的一个创意型 Skill,专门为 Slack 的限制做优化:
- 输出尺寸默认 128×128(Slack 自定义 emoji 推荐尺寸);
- 帧数控制在 5-15 帧,保证文件 < 256KB(Slack 上传限制);
- 调色板限制在 128 色内,用 GIF 调色板量化避免体积爆炸;
- 支持文字、简单形状、缓动函数(easing),让小动图不”硬切”。
AI 在生成时,会主动读取 SKILL.md 里的约束,直接给你一个能直接拖进 Slack 的 .gif 文件,顺便给一个建议的 emoji 短名。
适合:远程团队 admin、DevRel、社群运营。
准备工作
- Python ≥ 3.10
- ImageMagick(用于 GIF 调色板量化)
pip install pillow numpy(用于图像处理)- 一个支持 SKILL.md 的 agent
- 可选:ffmpeg,用于把视频转成帧再合成
3 步快速上手
第 1 步:克隆与软链
git clone https://github.com/anthropics/skills.git
ln -sf "$(pwd)/skills/slack-gif-creator" \
~/.claude/skills/slack-gif-creator
OpenCode 用户把目标路径改为 ~/.config/opencode/skills/。
第 2 步:验证依赖
python -c "import PIL, numpy; print('ok')"
magick -version | head -1
如果 ImageMagick 报”无法加载策略”,在 Windows 上以管理员执行一次 magick -configure 即可。Linux/macOS 用 brew install imagemagick 或 apt install imagemagick。
第 3 步:生成第一个 GIF 表情
在 agent 对话里说:
用 slack-gif-creator 给我做一个"PR 合并成功"主题的动画 emoji,
128x128,小于 100KB,适合 Slack 自定义 emoji。
AI 会按 SKILL.md 里的”PR 合并 → 绿色对勾 + 撒花”模板,生成一个 8 帧的小动图,落到本地(例如 output/pr_merged.gif)。你会拿到:
- 文件路径
- 体积(几 KB 到几十 KB)
- 建议的 emoji 短名
:pr-merged: - 一句话说明动画节奏(每帧 80ms,共 640ms 循环)
接下来你可以用 Slack 的 “Customize → Add Custom Emoji” 把这个文件传上去,贴 :pr-merged: 就能用。
常见踩坑
- 文件超过 256KB:Slack 自定义 emoji 限制 256KB,超了会拒绝上传。让 Skill 显式把帧数砍到 5-8。
- 动画看起来”硬切”:缺缓动,Skill 默认会加
ease-in-out,但如果你自己手改参数可能丢。 - 颜色断层:GIF 只支持 256 色,渐变背景容易出现明显色阶。Skill 默认会把背景纯色化或用 2-3 色过渡。
- 尺寸大于 128x128:Slack 实际接受 128x128,部分客户端会缩放,但 IM 客户端会强制要求 128。让 Skill 严格按这个尺寸出。
- 透明背景没生效:导出时没设
disposal=2或没保留 alpha 通道,贴到深色 Slack 上背景会发白。明确说”保留透明背景”。 - 循环不顺畅:首尾帧不一致导致”跳一下”,让 Skill 强制首帧 = 末帧,或在 SKILL.md 里加
loop_hint。
初级用法
- 节日小彩蛋:春节、双十一、Friday,做个应景的”庆祝”表情,贴团队群活跃气氛。
- 状态信号:做
:deploying:、:oncall-pager:这种状态 emoji,谁要 oncall 直接贴一个。
高级玩法
- 接入文字转 GIF:把”老板发话”那句金句转成有打字机动画的 GIF,直接做成”群梗”素材。
- 结合 Lottie 思路:复杂动画建议先输出 Lottie JSON,再转 GIF,质量更好但工作流更重。
- 批量生成家族表情:用 Skill 一次出”happy / sad / lol / mind-blown”一套,统一画风。
小技巧
- 浅色和深色 Slack 主题下表现差异大,导出后两种主题都看一眼。
- 帧率 12-15fps 在 128x128 下最舒服,再高会显得”卡顿感”(其实是 GIF 量化伪影)。
- 用
magick identify output.gif可以快速看帧数、尺寸、文件大小,初步校验。 - 给表情加 1-2 像素内边距(不要贴满),在 IM 客户端里更”透气”。
- 团队命名规范统一前缀(如
:team-、:ship-),方便自动补全。
常见问题 FAQ
Q1: 这个 Skill 跟 slack-gif-creator 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: slack-gif-creator 来自 Anthropic,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 取决于 slack-gif-creator 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
进阶学习建议
如果想进一步用好 slack-gif-creator,建议按以下路径学习:
第 1 周:熟练使用
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记
第 2 周:理解机制
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的”触发关键词”和”输出格式”
- 学习”如何用更具体的描述触发 Skill”
第 3-4 周:组合使用
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
长期:贡献社区
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
推荐资源:
- 官方文档:https://github.com/anthropics/skills
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- 仓库主页:https://github.com/anthropics/skills
- slack-gif-creator 目录:https://github.com/anthropics/skills/tree/main/skills/slack-gif-creator
- ImageMagick 文档:https://imagemagick.org/script/command-line-tools.php
- Pillow 文档:https://pillow.readthedocs.io/
- Slack 自定义 emoji 规范:https://slack.com/help/articles/206870177-Add-custom-emoji-and-aliases
- 相关 Skill:anthropic-brand-guidelines
我的个人推荐(测试编辑 Mnet)
最常用的 1 个核心用法:每天打开 Agent 第一时间加载这个 Skill,既不消耗太多 token 也能规范输出。
最容易踩的坑:别把 Skill 提示词当”开箱即用”的最终答案——它只是给你一个”标准框架”,具体项目还得你自己调整。
适合人群:做过 3+ 个实际项目的开发者,而不是”看一遍文档就完事”的小白。
3 个月使用心得:刚开始用时觉得”规范是约束”,用了 3 个月后才发现”规范是省时间”——避免每次重新决策同样的细节。
推荐配合的工具:Claude Code / Cursor / OpenCode 任选一个主流 Agent 即可,不要在工具选择上纠结太久。
长期价值:这类 Skill 的核心价值不是”立竿见影的输出”,而是”持续一致的质量”——长期用下来,你的项目质量会稳定在专业水平。
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
slack-gif-creator Skill 多维度简评
类别:创意 / 动画 / 沟通增强 仓库:anthropics/skills 维护者:Anthropic 官方 技术栈:Pillow + imageio
一、核心定位与价值
slack-gif-creator 是 Anthropic 17 个 Skill 中**最”小而美”**的——专注于一件事:生成针对 Slack 优化的动画 GIF。在团队沟通中,合适的 emoji GIF / 消息 GIF 极大提升表达力:
- 🎉 庆祝时刻(上线完成、拿到 offer、合同签署)
- 🚀 高能时刻(发布、刷新纪录)
- 😅 尴尬时刻(prod 报错、PR 被拒)
- 👀 强调时刻(“看这里”)
关键洞见:Slack 对 GIF 有严格的尺寸 + 文件大小限制(emoji 128KB,消息 2MB),不是所有 GIF 都能直接用——这个 Skill 强制遵守 Slack 规范。
适用场景
- 团队 Slack 频道文化
- 庆祝 / 表情包制作
- 文档 / 教程插图
- 客户演示动效
- Bug 报告附加动图
不适用场景
- 复杂视频剪辑(用 ffmpeg / Premiere)
- 静态图片(用 canvas-design)
- 商业广告(用专业动效工具)
- 4K 高清视频
二、Slack GIF 规范
2.1 尺寸与文件大小限制
| 类型 | 尺寸 | 文件大小 | 用途 |
|---|---|---|---|
| Emoji GIF | 128×128 px | ≤ 128 KB | 自定义 emoji |
| 消息 GIF | 480×480 px | ≤ 2 MB | 直接在消息中显示 |
| 横幅 GIF | 480×270 px(16:9) | ≤ 2 MB | 较大场景 |
2.2 帧率与时长
| 参数 | 推荐值 | 原因 |
|---|---|---|
| FPS | 10-20 | 太高文件大,太低不流畅 |
| 时长 | 0.5-3 秒 | emoji 越短越好,消息图 2-3 秒 |
| 循环 | 无限循环 | GIF 默认;用 Pillow loop=0 |
| 颜色数 | 48-128 | 调色板小,文件小 |
2.3 Slack 兼容性
- ✅ 透明度支持(alpha 通道)
- ✅ 帧间优化(disposal method)
- ⚠️ 不支持 WebP(Slack 自动转)
- ⚠️ 某些 emoji 平台对大文件不友好
三、核心组件
3.1 GIFBuilder
主类:构建 GIF 帧序列。
from slack_gif_creator import GIFBuilder
builder = GIFBuilder(
width=128,
height=128,
fps=15,
num_frames=30,
loop=0, # 无限循环
)
# 添加帧
for t in range(30):
frame = render_rocket_launch(t) # 你的渲染函数
builder.add_frame(frame)
# 保存
builder.save("rocket.gif", optimize=True)
3.2 Validators
验证器:确保 GIF 符合 Slack 规范。
from slack_gif_creator.validators import validate_gif
result = validate_gif("rocket.gif")
# {
# "valid": True,
# "width": 128,
# "height": 128,
# "size_kb": 95,
# "fps": 15,
# "frames": 30,
# "duration_s": 2.0,
# "transparent": True
# }
3.3 Easing Functions
缓动函数:让动画更自然。
from slack_gif_creator.easing import (
linear, ease_in_quad, ease_out_quad,
ease_in_out_cubic, ease_in_back, ease_out_bounce
)
# 用法
progress = 0.5 # 0.0 到 1.0
eased = ease_out_bounce(progress)
y = lerp(start_y, end_y, eased)
| 缓动 | 效果 | 适用 |
|---|---|---|
| linear | 匀速 | 进度条 |
| ease_in_quad | 慢启动 | 加速场景 |
| ease_out_quad | 慢停止 | 减速场景 |
| ease_in_out_cubic | 慢-快-慢 | 通用 |
| ease_out_bounce | 反弹 | 弹跳物体 |
| ease_in_back | 回拉 | 强调起点 |
四、8 大动画概念
4.1 震动(Shake)
def render_shake(t, num_frames=20):
"""左右震动的 emoji"""
amplitude = 5
frequency = 2
offset = amplitude * math.sin(2 * math.pi * frequency * t / num_frames)
return render_emoji_with_offset(offset, 0)
适合:报错、惊讶、震惊。
4.2 脉冲(Pulse)
def render_pulse(t, num_frames=20):
"""缩放脉冲"""
scale = 1.0 + 0.2 * math.sin(2 * math.pi * t / num_frames)
return render_emoji_scaled(scale)
适合:提醒、关注、重要。
4.3 弹跳(Bounce)
def render_bounce(t, num_frames=30):
"""落地弹跳"""
g = 9.8
height = 100
duration = 1.0
y = -4 * g * (t/num_frames * duration)**2 + 4 * g * (t/num_frames * duration)
y = max(0, y)
return render_ball_at(0, height - y)
适合:庆祝、消息送达、完成。
4.4 旋转(Spin)
def render_spin(t, num_frames=30):
"""360 度旋转"""
angle = 360 * t / num_frames
return render_emoji_rotated(angle)
适合:加载、思考、循环。
4.5 淡入淡出(Fade)
def render_fade(t, num_frames=30):
"""淡入 + 淡出"""
half = num_frames / 2
if t < half:
alpha = t / half
else:
alpha = (num_frames - t) / half
return render_emoji_with_alpha(alpha)
适合:出现、消失、转场。
4.6 滑动(Slide)
def render_slide(t, num_frames=30):
"""从左滑入"""
x = -128 + (128 + 128) * t / num_frames
return render_emoji_at(x, 0)
适合:出现、推送、提示。
4.7 缩放(Zoom)
def render_zoom(t, num_frames=30):
"""从小变大"""
scale = t / num_frames
return render_emoji_scaled(scale)
适合:聚焦、放大、突出。
4.8 爆炸(Explode)
def render_explode(t, num_frames=30):
"""爆炸粒子向外飞"""
if t < 5:
return render_ball() # 初始球
progress = (t - 5) / (num_frames - 5)
particles = []
for i in range(20):
angle = 2 * math.pi * i / 20
dist = 100 * progress
x = 64 + dist * math.cos(angle)
y = 64 + dist * math.sin(angle)
particles.append((x, y))
return render_particles(particles, alpha=1-progress)
适合:完蛋、震惊、烟花。
五、完整实战示例
5.1 示例 1:火箭发射 🚀
from slack_gif_creator import GIFBuilder
from slack_gif_creator.easing import ease_in_cubic
import math
builder = GIFBuilder(128, 128, fps=20, num_frames=40)
for t in range(40):
frame = Image.new("RGBA", (128, 128), (0, 0, 0, 0))
draw = ImageDraw.Draw(frame)
# 火箭 Y 坐标
progress = t / 40
y_offset = -100 * ease_in_cubic(progress) # 从下飞到上
# 画火箭
draw.ellipse([54, int(60 + y_offset), 74, int(80 + y_offset)], fill="white")
# 画火焰
if progress < 0.8:
flame_y = int(82 + y_offset)
draw.polygon([
(60, flame_y), (68, flame_y + 15), (64, flame_y)
], fill="orange")
# 画星星背景
for i in range(5):
sx = (i * 31 + t) % 128
sy = (i * 17) % 128
draw.ellipse([sx, sy, sx+2, sy+2], fill="white")
builder.add_frame(frame)
builder.save("rocket-launch.gif", optimize=True)
5.2 示例 2:庆祝烟花 🎉
def render_celebration(t, num_frames=30):
frame = Image.new("RGBA", (128, 128), (0, 0, 0, 0))
draw = ImageDraw.Draw(frame)
if t < 10:
# 准备
return frame
progress = (t - 10) / 20
cx, cy = 64, 64
# 8 条射线
for i in range(8):
angle = 2 * math.pi * i / 8
dist = 50 * progress
x = cx + dist * math.cos(angle)
y = cy + dist * math.sin(angle)
color = ["red", "blue", "green", "yellow", "orange", "purple", "pink", "cyan"][i]
draw.ellipse([x-3, y-3, x+3, y+3], fill=color)
# 中心亮点
if t < 15:
draw.ellipse([60, 60, 68, 68], fill="white")
return frame
5.3 示例 3:失败甩头 😅
def render_shake_head(t, num_frames=24):
"""左右甩头 3 次"""
frame = Image.new("RGBA", (128, 128), (0, 0, 0, 0))
draw = ImageDraw.Draw(frame)
# 3 次甩动
frequency = 3
angle = 15 * math.sin(2 * math.pi * frequency * t / num_frames)
# 画脸
draw.ellipse([40, 40, 88, 88], fill="yellow", outline="black", width=2)
draw.ellipse([54, 60, 64, 70], fill="black") # 左眼
draw.ellipse([74, 60, 84, 70], fill="black") # 右眼
draw.arc([54, 74, 74, 88], 0, 180, fill="black", width=2) # 苦笑
# 应用旋转
return frame.rotate(angle, resample=Image.BICUBIC, center=(64, 64))
六、性能与文件大小优化
6.1 文件大小控制
# Pillow 优化
builder.save("output.gif",
optimize=True, # 启用优化
disposal=2, # 每帧独立
transparency=0) # 透明色索引
# 调色板量化(48 颜色)
from PIL import Image
img = Image.open("output.gif")
img = img.quantize(colors=48, method=Image.Quantize.MEDIANCUT)
img.save("output-small.gif", optimize=True)
6.2 文件大小 vs 质量
| 配置 | 文件大小 | 质量 |
|---|---|---|
| 256 色, 30 帧 | 200 KB | 高 |
| 128 色, 30 帧 | 120 KB | 良好 |
| 64 色, 20 帧 | 60 KB | 可接受 |
| 32 色, 15 帧 | 30 KB | emoji 风格 |
6.3 帧率 vs 时长
| 配置 | 时长 | 效果 |
|---|---|---|
| 15 FPS × 2 秒 | 30 帧 | 流畅 |
| 10 FPS × 2 秒 | 20 帧 | 良好 |
| 20 FPS × 1.5 秒 | 30 帧 | 快速 |
七、与其他 Skill 配合
| Skill | 配合方式 |
|---|---|
| canvas-design | 用 canvas-design 创作静态图,转 GIF |
| theme-factory | 应用品牌色到 GIF |
| brand-guidelines | 应用 Anthropic 品牌色 |
| frontend-design | 网页动态素材 |
| slack (MCP) | 直接上传到 Slack |
八、5 条反合理化
| 借口 | 反驳 |
|---|---|
| ”直接用现成 GIF” | 自己做的 = 团队文化 + 不侵权 |
| ”GIF 文件大不用” | emoji 128KB 就够 |
| ”GIF 已过时” | Slack 表情库 80% 是 GIF |
| ”我不会做动画” | Skill 提供 8 种现成动画模式 |
| ”视频比 GIF 清楚” | Slack 不支持视频,GIF 是事实标准 |
九、5 条实战技巧
- 统一调色板:用 Pillow quantize 减色,文件小 50%
- 透明度优化:用
disposal=2让每帧独立清屏 - 测试多设备:在手机 / PC / 平板都要看一遍
- 使用透明背景:emoji GIF 不要带白色底
- 命名规范:
team-action-style.gif(team-rocket-launch-v1.gif)
十、Q&A
Q: 必须用 Claude 吗? A: 工具本身(Pillow)任何 Python 环境都能跑。Skill 让 Claude 自动生成。
Q: 跟 FFmpeg 比? A: FFmpeg 处理视频;slack-gif-creator 专门做小尺寸 GIF。
Q: 支持 APNG 吗? A: 不直接支持。但 Pillow 可以用帧序列模拟。
Q: 中文 / emoji 字符? A: Pillow 用 truetype 加载字体,可写中文。
Q: WebP 替代? A: WebP 文件更小,但 Slack 兼容性不如 GIF 稳。
Q: 帧间压缩? A: Pillow 自动做 delta 编码,重复区域不存储。
Q: 商用版权? A: 自己做的 GIF 版权归你;现成的 GIPHY 有版权。
十一、Prompt 模板
模板 1:庆祝 GIF
[场景] 项目上线成功
[动画] 烟花 / 火箭 / 鼓掌
[时长] 1.5 秒
[风格] Anthropic 品牌色(橙 #d97757)
[输出] emoji 128×128, ≤128KB
模板 2:错误提示 GIF
[场景] 服务器 500
[动画] 震动 + 红色警告
[时长] 2 秒
[风格] 红色调
[输出] 消息 GIF 480×480
模板 3:加载动画
[场景] 数据加载中
[动画] 旋转的圆环
[时长] 1 秒(无限循环)
[风格] 蓝色调
[输出] 消息 GIF 480×480
十二、真实踩坑案例
案例 1:文件超过 128KB
现象:emoji 上传失败。 根因:颜色过多 + 帧数过多。 解决:
# 减少颜色到 48
img = img.quantize(colors=48)
# 减少帧数到 20
# 降低分辨率
案例 2:动画卡顿
现象:在 Slack 里看着一卡一卡。 根因:FPS 太低(< 10)。 解决:15-20 FPS 是甜点。
案例 3:白底不透明
现象:在深色 Slack 主题下,GIF 有白底方块。 根因:保存时没设透明。 解决:
img = Image.new("RGBA", (128, 128), (0, 0, 0, 0)) # 透明
img.save("out.gif", transparency=0)
案例 4:循环不连续
现象:GIF 跳一下。 根因:最后一帧和第一帧差异大。 解决:让最后一帧 = 第一帧的”前态”。
案例 5:颜色抖动(banding)
现象:渐变处有明显条纹。 根因:颜色量化导致。 解决:
# 抖动算法
img = img.quantize(colors=64, method=Image.Quantize.FASTOCTREE, dither=Image.Dither.FLOYDSTEINBERG)
案例 6:内存爆炸
现象:100 帧 × 480×480 内存爆。 根因:所有帧 load 在内存。 解决:
# 用 generator 流式
def frame_generator():
for t in range(100):
yield render(t)
builder.add_frames(frame_generator())
案例 7:上传到 Slack 失败
现象:文件 1.9MB,但 Slack 报超限。 根因:base64 编码后体积略增。 解决:保持 ≤ 1.5MB 更稳。
案例 8:emoji 平台不支持
现象:GIPHY 上传成功但 Slack 不显示。
根因:尺寸 / 帧率 / 透明度违规。
解决:用 validate_gif() 函数预检。
十三、安装
# Claude Code
/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropic-agent-skills
# 通用
npx skills add anthropics/skills --skill slack-gif-creator
# 依赖
pip install pillow imageio
十四、总结
核心价值:
- Slack 优化动画 GIF
- 8 种现成动画模式
- 严格遵守 Slack 规范(128KB emoji, 2MB 消息)
- 与 Anthropic 品牌集成
适用人群:
- 团队 Slack 管理员
- 远程团队文化推动者
- 客户支持
- Bug 报告附加动图
投入产出比:⭐⭐⭐(3/5)—— 按需装。
何时不要用:
- 复杂视频
- 静态图(用 canvas-design)
- 没有 Slack 协作
- 不需要动画
参考资料
配套文档:canvas-design 海报 | theme-factory 主题 | internal-comms 沟通
快速安装
git clone https://github.com/anthropics/skills.git
ln -sf "$(pwd)/skills/slack-gif-creator" \
~/.claude/skills/slack-gif-creator