slack-gif-creator

slack-gif-creator

熱門

專為 Slack 打造動態 GIF 的知識庫與實用工具。提供尺寸規範限制、驗證工具及動畫概念說明。當使用者要求製作 Slack 專用的動態 GIF(例如「幫我做一個 X 在做 Y 的 Slack GIF」)時使用。

15萬星標
1.9萬分支
更新於 2026/6/21
SKILL.md
唯讀
名稱
slack-gif-creator
描述

專為 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 += vxy += 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
)

設計哲學

本 Skill 提供:

  • 知識:Slack 的規格要求與動畫設計概念
  • 工具函式:GIFBuilder、驗證工具(validators)、緩動函數(easing functions)
  • 彈性:使用 PIL 基礎圖形自行建構動畫邏輯

本 Skill 不提供

  • 刻板的動畫範本或現成函式
  • Emoji 字型渲染(跨平台表現不穩定)
  • 內建於本 Skill 中的預製圖形庫

關於使用者上傳圖片的說明:本 Skill 未內建現成圖形,但若使用者上傳了圖片,請使用 PIL 載入並處理 —— 並根據使用者的需求判斷是要直接套用還是僅作為設計參考。

請大膽發揮創意!嘗試組合多種動畫概念(例如:彈跳 + 旋轉、脈動 + 滑動等),充分活用 PIL 的完整功能。

依賴套件

pip install pillow imageio numpy