Slack GIF Creator은(는) 무엇을 하나요?
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
# 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)
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("준비 완료!")
Easing 함수 (core.easing)
선형 대신 부드러운 움직임:
from core.easing import interpolate
# 진행률 0.0에서 1.0
# 각 프레임의 진행률: t = i / (num_frames - 1)
# Easing 적용
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 이미지 생성, 알파 채널 조정
- 또는
Image.blend(image1, image2, alpha)사용 - 페이드 인: 알파 0에서 1
- 페이드 아웃: 알파 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 - 시간이 지남에 따라 입자 페이드 아웃 (알파 감소)
최적화 전략
파일 크기를 줄이라는 요청이 있을 때만 다음 방법 중 일부를 구현하세요:
- 프레임 수 줄이기 - 더 낮은 FPS (20 대신 10) 또는 더 짧은 지속 시간
- 색상 수 줄이기 - 128 대신
num_colors=48 - 크기 줄이기 - 480x480 대신 128x128
- 중복 제거 - 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