slack-gif-creator
npx skills add https://github.com/marcelleon/skills-zh --skill slack-gif-creator
Agent 安装分布
Skill 文档
Slack GIF Creator
ä¸ä¸ªå·¥å ·å ï¼æä¾ç¨äºå建é对 Slack ä¼åçå¨ç» GIF çå®ç¨å·¥å ·åç¥è¯ã
Slack è¦æ±
尺寸ï¼
- 表æ ç¬¦å· GIFï¼128×128ï¼æ¨èï¼
- æ¶æ¯ GIFï¼480×480
åæ°ï¼
- 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)
ä¸è¦ä½¿ç¨ï¼ 表æ 符å·åä½ï¼è·¨å¹³å°ä¸å¯é ï¼æåè®¾æ¤æè½ä¸åå¨é¢å è£ çå¾å½¢ã
使å¾å½¢çèµ·æ¥æ´å¥½
å¾å½¢åºè¯¥çèµ·æ¥ç²¾è´è坿åæï¼è䏿¯åºç¡çã以䏿¯æ¹æ³ï¼
ä½¿ç¨æ´ç²ççº¿æ¡ – å§ç»ä¸ºè½®å»å线æ¡è®¾ç½® 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 ady('my.gif'):
print("åå¤å¥½äºï¼")
ç¼å¨å½æ° (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
叧婿 (core.frame_composer)
常è§éæ±ç便æ·å½æ°ï¼
from core.frame_composer import (
create_blank_frame, # 纯è²èæ¯
create_gradient_background, # åç´æ¸å
draw_circle, # å形婿
draw_text, # ç®åææ¬æ¸²æ
draw_star # 5 è§æ
)
å¨ç»æ¦å¿µ
ææ/éå¨
ç¨æ¯è¡å移对象ä½ç½®ï¼
- 使ç¨
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ï¼
ä¼åçç¥
ä» å½è¢«è¦æ±ä½¿æä»¶å¤§å°æ´å°æ¶ï¼å®æ½ä»¥ä¸å ç§æ¹æ³ï¼
- æ´å°ç帧 – è¾ä½ç FPSï¼10 è䏿¯ 20ï¼ææ´ççæç»æ¶é´
- æ´å°çé¢è² –
num_colors=48è䏿¯ 128 - æ´å°ç尺寸 – 128×128 è䏿¯ 480×480
- å é¤éå¤é¡¹ – å¨ save() ä¸ä½¿ç¨
remove_duplicates=True - 表æ
ç¬¦å·æ¨¡å¼ –
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