slack-gif-creator — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited slack-gif-creator (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
---
name: slack-gif-creator
description: 用于创建针对 Slack 优化的 GIF 动画的知识和工具。提供约束条件、验证工具和动画概念。当用户请求为 Slack 制作 GIF 动画时使用,例如“为我制作一个 X 做 Y 的 Slack GIF”。
license: 完整条款见 LICENSE.txt
---
# Slack GIF 创建器
一个提供工具和知识的工具包,用于创建针对 Slack 优化的 GIF 动画。
## Slack 要求
**尺寸:**
- 表情符号 GIF:128x128(推荐)
- 消息 GIF:480x480
**参数:**
- FPS:10-30(越低文件尺寸越小)
- 颜色数:48-128(越少文件尺寸越小)
- 时长:表情符号 GIF 保持在 3 秒以下
## 核心工作流程
from core.gif_builder import GIFBuilder from PIL import Image, ImageDraw
builder = GIFBuilder(width=128, height=128, fps=10)
for i in range(12): frame = Image.new('RGB', (128, 128), (240, 248, 255)) draw = ImageDraw.Draw(frame)
builder.add_frame(frame)
builder.save('output.gif', num_colors=48, optimize_for_emoji=True)
## 绘制图形
### 处理用户上传的图片
如果用户上传了一张图片,请考虑他们是想:
- **直接使用**(例如,“给这个做成动画”,“把这个分割成帧”)
- **作为灵感**(例如,“做一个类似这样的东西”)
使用 PIL 加载和处理图片:from PIL import Image
uploaded = Image.open('file.png')
### 从零开始绘制
当从零开始绘制图形时,请使用 PIL ImageDraw 的图元:
from PIL import ImageDraw
draw = ImageDraw.Draw(frame)
draw.ellipse([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)
points = [(x1, y1), (x2, y2), (x3, y3), ...] draw.polygon(points, fill=(r, g, b), outline=(r, g, b), width=3)
draw.line([(x1, y1), (x2, y2)], fill=(r, g, b), width=5)
draw.rectangle([x1, y1, x2, y2], fill=(r, g, b), outline=(r, g, b), width=3)
**不要使用:** 表情符号字体(跨平台不可靠)或假设此技能中存在预打包的图形。
### 如何让图形更美观
图形应该看起来精致且有创意,而不是基础水平。方法如下:
**使用更粗的线条** - 轮廓和线条的 `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) # 添加 PIL Image builder.add_frames(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
passes, info = validate_gif('my.gif', is_emoji=True, verbose=True)
if is_slack_ready('my.gif'): print("Ready!")
### 缓动函数 (`core.easing`)
平滑运动而非线性运动:from core.easing import interpolate
t = i / (num_frames - 1)
y = interpolate(start=0, end=400, t=t, easing='ease_out')
### 帧助手 (`core.frame_composer`)
用于满足常见需求的便捷函数:from core.frame_composer import ( create_blank_frame, # 纯色背景 create_gradient_background, # 垂直渐变 draw_circle, # 绘制圆形的辅助函数 draw_text, # 简单的文本渲染 draw_star # 五角星 )
## 动画概念
### 摇晃/振动
通过振荡来偏移对象位置:
- 结合帧索引使用 `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(例如从 20 降至 10)或缩短时长
2. **更少的颜色** - `num_colors=48` 而不是 128
3. **更小的尺寸** - 128x128 而不是 480x480
4. **移除重复帧** - 在 `save()` 中设置 `remove_duplicates=True`
5. **表情符号模式** - `optimize_for_emoji=True` 会自动优化
builder.save( 'emoji.gif', num_colors=48, optimize_for_emoji=True, remove_duplicates=True )
## 设计理念
此技能提供:
- **知识**:Slack 的要求和动画概念
- **工具**:GIFBuilder、验证器、缓动函数
- **灵活性**:使用 PIL 图元创建动画逻辑
它不提供:
- 刻板的动画模板或预制函数
- 表情符号字体渲染(跨平台不可靠)
- 技能内置的预打包图形库
**关于用户上传的说明**:此技能不包含预构建的图形,但如果用户上传图片,请使用 PIL 加载并处理它——根据他们的请求来判断是想直接使用还是仅作为灵感。
发挥创意!结合各种概念(弹跳+旋转、脉冲+滑动等)并充分利用 PIL 的全部功能。
## 依赖项
pip install pillow imageio numpy
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.