專為 Slack 打造動態 GIF 的知識庫與實用工具。提供尺寸規範限制、驗證工具及動畫概念說明。當使用者要求製作 Slack 專用的動態 GIF(例如「幫我做一個 X 在做 Y 的 Slack GIF」)時使用。
Slack GIF Creator
一套提供工具與知識的工具包,專為 Slack 打造最佳化的動態 GIF。
Slack 規格要求
尺寸:
- 表情符號(Emoji)GIF:128x128(推薦)
- 訊息 GIF:480x480
參數:
- FPS(每秒畫格數):10-30(數值越低,檔案越小)
- 色彩數:48-128(色彩越少,檔案越小)
- 時長:表情符號 GIF 請保持在 3 秒以內
核心工作流程
from core.gif_builder import GIFBuilder
from PIL import Image, ImageDraw
# 1. 建立建構器
builder = GIFBuilder(width=128, height=128, fps=10)
# 2. 生成畫格
for i in range(12):
frame = Image.new('RGB', (128, 128), (240, 248, 255))
draw = ImageDraw.Draw(frame)
# 使用 PIL 基礎圖形繪製動畫
# (圓形、多邊形、線條等)
builder.add_frame(frame)
# 3. 儲存並進行最佳化
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)
請勿使用: 表情符號字型(Emoji fonts,跨平台相容性差),也不要假設此 Skill 中已有預先打包好的圖形資源。
提升視覺質感
圖形應具備精緻度與創意,避免過於單調。建議做法如下:
使用較粗的線條 —— 輪廓與線條請一律設定 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)
Validators (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!")
Easing Functions (core.easing)
提供平滑的動態曲線,而非單純的等速線性移動:
from core.easing import interpolate
# 進度從 0.0 至 1.0
t = i / (num_frames - 1)
# 套用緩動效果
y = interpolate(start=0, end=400, t=t, easing='ease_out')
# 可用效果:linear, ease_in, ease_out, ease_in_out,
# bounce_out, elastic_out, back_out
Frame Helpers (core.frame_composer)
處理常見需求的便利函式:
from core.frame_composer import (
create_blank_frame, # 單色背景
create_gradient_background, # 垂直漸層背景
draw_circle, # 圓形繪製輔助函式
draw_text, # 簡單文字繪製
draw_star # 五角星繪製
)
動畫概念
震動/晃動(Shake/Vibrate)
透過週期性震盪偏移物件位置:
- 配合畫格索引使用
math.sin()或math.cos() - 加入些微隨機變化以營造自然感
- 套用至 x 軸及/或 y 軸位置
脈動/心跳(Pulse/Heartbeat)
節奏性地縮放物件尺寸:
- 使用
math.sin(t * frequency * 2 * math.pi)實現平滑脈動 - 模擬心跳效果:連續兩次快速脈動後停頓(調整正弦波)
- 縮放範圍控制在基準尺寸的 0.8 到 1.2 倍之間
彈跳(Bounce)
物件落下並彈起:
- 著地時套用
interpolate()搭配easing='bounce_out' - 落下(加速)時使用
easing='ease_in' - 透過每格增加 y 軸速度來模擬重力效果
旋轉(Spin/Rotate)
圍繞中心點旋轉物件:
- PIL:
image.rotate(angle, resample=Image.BICUBIC) - 擺動效果:使用正弦波計算角度以取代線性旋轉
淡入/淡出(Fade In/Out)
逐漸顯現或消失:
- 建立 RGBA 圖像並調整 Alpha 通道
- 或使用
Image.blend(image1, image2, alpha) - 淡入:Alpha 從 0 變為 1
- 淡出:Alpha 從 1 變為 0
滑動(Slide)
物件從畫面外移動至指定位置:
- 起始位置:畫格邊界外
- 終點位置:目標位置
- 使用
interpolate()搭配easing='ease_out'實現平滑煞停 - 若要實現回彈/過衝效果:使用
easing='back_out'
縮放(Zoom)
調整尺寸與位置以實現鏡頭縮放效果:
- 放大(Zoom in):尺寸從 0.1 放大至 2.0,並裁切中心
- 縮小(Zoom out):尺寸從 2.0 縮小至 1.0
- 可加上動態模糊以增強戲劇感(使用 PIL 濾鏡)
爆炸/粒子噴發(Explode/Particle Burst)
建立向外輻射噴發的粒子效果:
- 生成具有隨機角度與速度的粒子群
- 更新每個粒子位置:
x += vx、y += vy - 加上重力影響:
vy += gravity_constant - 隨著時間逐漸淡出粒子(降低 Alpha 值)
最佳化策略
僅在被要求縮減檔案大小時,再實作以下幾種方法:
- 減少畫格數 —— 降低 FPS(例如從 20 降至 10)或縮短時長
- 減少色彩數 —— 將色彩設定改為
num_colors=48(取代 128) - 縮小尺寸 —— 使用 128x128 代替 480x480
- 移除重複畫格 —— 在 save() 中設定
remove_duplicates=True - 表情符號模式 —— 設定
optimize_for_emoji=True進行自動最佳化
# 表情符號的最大化最佳化設定
builder.save(
'emoji.gif',
num_colors=48,
optimize_for_emoji=True,
remove_duplicates=True
)
設計哲學
本 Skill 提供:
- 知識:Slack 的規格要求與動畫設計概念
- 工具函式:GIFBuilder、驗證工具(validators)、緩動函數(easing functions)
- 彈性:使用 PIL 基礎圖形自行建構動畫邏輯
本 Skill 不提供:
- 刻板的動畫範本或現成函式
- Emoji 字型渲染(跨平台表現不穩定)
- 內建於本 Skill 中的預製圖形庫
關於使用者上傳圖片的說明:本 Skill 未內建現成圖形,但若使用者上傳了圖片,請使用 PIL 載入並處理 —— 並根據使用者的需求判斷是要直接套用還是僅作為設計參考。
請大膽發揮創意!嘗試組合多種動畫概念(例如:彈跳 + 旋轉、脈動 + 滑動等),充分活用 PIL 的完整功能。
依賴套件
pip install pillow imageio numpy






