본문 바로가기

파일 형식 백과사전

움짤(GIF) 용량이 유독 커요, 프레임과 색상 수로 줄이는 법

사진 몇 장을 이어 붙여 움짤을 만들었는데, 정지 사진 하나보다 용량이 몇 배나 커진 경험 있으신가요. 카카오톡으로 보내려니 전송이 느리고, 커뮤니티에 올리려니 용량 제한에 걸리기도 합니다.

결론부터 말씀드리면 GIF 용량은 화질 손실 압축인 JPG와 계산 방식이 다릅니다. 프레임 수와 색상 수, 이 두 가지가 용량을 사실상 결정합니다. 같은 3초짜리 애니메이션을 설정만 바꿔 실제로 저장해 봤습니다.

같은 3초 애니메이션을 설정만 바꿔 저장한 GIF 실측 용량. 색상 256 고정 기준 10프레임 181.9KB, 30프레임 545.5KB, 60프레임 1091.3KB. 30프레임 고정 기준 256색 548.4KB, 64색 273.5KB, 16색 123.6KB

실제로 만들어서 재 봤습니다

움직이는 도형이 담긴 300x300 크기의 3초짜리 애니메이션을 파이썬 Pillow로 직접 생성해, 프레임 수와 색상 수만 바꿔가며 GIF로 저장하고 용량을 쟀습니다. 측정 환경은 윈도우 11, 파이썬 3.14.3, Pillow 12.2.0입니다.

설정 파일 용량
10프레임, 256색 181.9 KB
30프레임, 256색 545.5 KB
60프레임, 256색 1,091.3 KB
30프레임, 64색 273.5 KB
30프레임, 16색 123.6 KB

프레임을 10에서 30으로 세 배 늘리자 용량도 딱 세 배로 늘었습니다. 반대로 색상 수를 256에서 64로 줄이자 용량이 절반 아래로 떨어졌고, 16색까지 줄이니 처음의 4분의 1 수준까지 내려갔습니다.


왜 프레임과 색상이 용량을 좌우할까

GIF는 화질을 뭉개면서 줄이는 JPG식 압축이 아니라, 각 프레임을 팔레트(색상표) 기반으로 저장하고 반복되는 패턴을 압축하는 방식입니다. 그래서 두 가지가 그대로 용량에 반영됩니다.

프레임 수는 곧 저장해야 할 그림의 개수입니다. 프레임이 30개면 화면을 30번 그려서 이어 붙이는 셈이라, 프레임이 늘어난 만큼 용량도 거의 비례해서 늘어납니다. 이건 어떤 내용의 움짤이든 구조적으로 성립하는 방향입니다.

색상 수는 조금 다릅니다. GIF는 픽셀마다 실제 색을 저장하지 않고, 팔레트에 담긴 색 번호만 저장합니다. 팔레트가 16색이면 번호를 표현하는 데 필요한 자리가 훨씬 작고, 같은 번호가 반복되는 구간도 압축이 잘 먹혀 용량이 눈에 띄게 줄어듭니다. 다만 색이 원래 다양한 사진일수록 색을 줄이면 뭉개짐이 두드러질 수 있어, 이 결과는 그림 내용에 따라 체감 차이가 달라질 수 있습니다.

 

그래서 어떻게 줄이면 될까

움짤을 처음 만들 때는 화면 녹화 도구 ScreenToGif가 윈도우에서 많이 쓰이는 무료 프로그램입니다. 화면 일부를 녹화해 바로 GIF로 저장할 수 있고, 저장할 때 프레임 수(재생 속도)와 색상 수를 직접 조절하는 옵션이 있습니다.

이미 만들어진 GIF의 용량을 줄이고 싶다면 ezgif.com 같은 온라인 GIF 최적화 도구를 씁니다. 파일을 올리면 프레임을 몇 개씩 건너뛰거나(프레임 줄이기), 색상 수를 낮추는 기능을 바로 쓸 수 있습니다. 다만 민감한 사진이라면 서버에 업로드된다는 점을 감안해야 합니다.

ScreenToGif 저장 옵션 예시
- 프레임 속도: 초당 10~15프레임이면 대부분 자연스럽게 보입니다
- 색상: 사람 동작이나 화면 캡처는 64색 정도로도 크게 티가 안 납니다
- 반복 재생(loop): 켜 두면 파일 안에 프레임이 추가되지는 않습니다

결정 규칙: 카톡이나 커뮤니티 전송용이면 프레임은 초당 10~15개, 색상은 64색 안팎이 용량과 화질의 무난한 균형점입니다.

 


직접 확인하고 싶다면

아래 코드는 이 글에서 실제로 쓴 측정 방식입니다. 프레임 수와 색상 수만 바꿔 가며 GIF로 저장하고 크기를 출력합니다.

from PIL import Image, ImageDraw
import math, os

def make_frames(n):
    frames = []
    for i in range(n):
        img = Image.new("RGB", (300, 300))
        px = img.load()
        shift = int((i / n) * 255)
        for y in range(300):
            for x in range(300):
                px[x, y] = ((x+shift) % 256, (y+shift) % 256, (x+y+shift*2) % 256)
        d = ImageDraw.Draw(img)
        a = (i / n) * 360
        cx, cy = 150 + 100*math.cos(math.radians(a)), 150 + 100*math.sin(math.radians(a))
        d.ellipse([cx-30, cy-30, cx+30, cy+30], fill=(255, 80, 80))
        frames.append(img)
    return frames

frames = make_frames(30)
quant = [f.convert("P", palette=Image.ADAPTIVE, colors=64) for f in frames]
quant[0].save("test.gif", save_all=True, append_images=quant[1:], duration=80, loop=0)
print(os.path.getsize("test.gif"), "bytes")

 

자주 묻는 질문

Q. 프레임을 줄이면 움직임이 뚝뚝 끊기지 않나요?
초당 10프레임 아래로 내려가면 눈에 띄게 끊깁니다. 다만 사람이 보기엔 초당 12~15프레임 정도면 대부분 부드럽게 느껴지고, 이 구간까지는 용량을 아끼면서도 티가 잘 안 납니다.

Q. 색상을 줄이면 화질이 얼마나 나빠지나요?
단색이나 그래픽 위주 움짤은 16색으로 줄여도 거의 표가 안 납니다. 반대로 사진처럼 색이 다양하면 색상을 줄일수록 경계가 거칠어지는 게 눈에 보일 수 있어, 내용에 따라 색상 수를 조절하는 편이 안전합니다.

Q. GIF 대신 다른 형식을 쓰면 더 작아지나요?
같은 움직임이라도 동영상 압축 방식을 쓰는 형식은 대체로 GIF보다 훨씬 작습니다. 다만 GIF는 별도 재생 프로그램 없이 어디서나 바로 재생된다는 호환성이 강점이라, 용량과 호환성 중 무엇이 더 중요한지에 따라 선택이 갈립니다.

 

움짤 용량이 커 보인다면 프레임과 색상 수부터 의심해 보시면 됩니다. 이미지 용량을 줄이는 다른 방법이 궁금하시다면, 사진 파일 용량을 줄이는 글도 함께 참고하시면 도움이 됩니다.

 

이 글의 용량 수치는 윈도우 11, 파이썬 3.14.3, Pillow 12.2.0 환경에서 같은 애니메이션을 직접 저장해 측정한 값입니다.

 

 

 

 

 

 

 

화질은 지키고 용량만 줄이기, 사진 한 장으로 두 방법을 실측해 봤습니다

이메일에 사진을 첨부하려는데 "첨부 용량 초과"가 뜨거나, 게시판에 올리려다 "한 장당 5MB까지"에 막히는 일이 자주 있습니다. 요즘 스마트폰 사진은 한 장이 5MB를 가볍게 넘기 때문입니다.사진

richyeon.com