← 블로그로 돌아가기

GIF 애니메이션 크기 줄이는 6가지 방법: 화질 손실 순서대로 정리

5초짜리 화면 녹화를 GIF로 변환했는데 크기가 18MB나 됐다. 문서나 채팅방, README에 올리려니 업로드 실패나 로딩 시간만 오래 걸린다. GIF는 왜 이렇게 큰 걸까? 그리고 화질 손실 없이 줄이는 방법은?

공유

5초 동안의 화면 녹화를 GIF로 변환했는데, 파일 크기를 확인해 보니 18MB나 됐다.
문서에 붙이거나 그룹 채팅에 올리거나 README에 넣으려고 하니 업로드가 실패하거나 로딩 시간이 너무 오래 걸린다.
왜 GIF는 영상보다 파일 크기가 더 큰 걸까? 그리고 어떻게 하면 화질 손실 없이 파일 크기를 줄일 수 있을까?


먼저 이해해야 할 점: GIF가 왜 이렇게 큰가

GIF는 1987년에 만들어진 포맷이고, 몇 가지 선천적인 제약 조건 때문에 '커 보인다':

  • 각 프레임은 완전한 이미지 하나다. 비디오처럼 '변화한 부분만 기록'하는 프레임 간 압축은 없다(변환 과정에서 최적화를 하지 않는 한). 100프레임은 100장의 이미지다.
  • 압축 알고리즘이 오래됐다. GIF는 LZW 무손실 압축만 사용하며, '연속된 같은 색상'을 잘 처리하지만, 그라데이션, 사진, 세밀한 텍스처가 들어가면 거의 압축이 안 된다.
  • 최대 256색만 지원한다. 색상이 부족하면 내보내기 도구는 '디더링(dithering)'을 사용한다. 밀도 높은 잡음 점을 찍어 전이를 흉내 낸다. 이 잡음은 사람 눈에는 부드러워 보이지만, LZW에게는 압축하기 가장 힘든 데이터다.

따라서 GIF의 용량은 **크기 × 프레임 수 × 각 프레임의 화면이 얼마나 '세밀한지'**에 따라 결정된다. 아래 방법들은 모두 이 세 가지 요소를 조정하는 것이다.

6가지 방법, 화질 손실 순서대로 정리

1. 프레임 최적화: '변화한 부분'만 저장 (무손실)

많은 화면 녹화 도구와 디자인 소프트웨어는 GIF를 내보낼 때 각 프레임마다 전체 화면을 저장한다. 하지만 화면 녹화 중에는 마우스와 작은 영역만 계속 움직이는 경우가 많다.

프레임 최적화는 각 프레임에서 이전 프레임과 다른 직사각형 영역만 남기고, 바뀌지 않은 부분은 투명 픽셀로 표시한다. 투명 픽셀이 하나로 이어지면 LZW로 압축할 때 효율이 매우 높아진다.

화면 픽셀이 전혀 변하지 않고 애니메이션 효과는 동일하지만, 저장 방식만 더 효율적이다. '배경은 고정되고 일부분만 움직이는' GIF(화면 녹화, UI 데모, 이모티콘)에는 이 단계만으로도 상당한 공간을 절약할 수 있다.

2. 손실 LZW: 압축 알고리즘에 '약간의 여유' 허용 (시각적 무손실)

이것은 gifsicle의 --lossy 옵션에서 나온 아이디어다. 인코딩할 때 색상에 아주 미세한 편차를 허용하여 더 많은 픽셀이 '같은 색상'으로 묶이게 하면, LZW의 효율이 크게 높아진다.

특징은 색상 수를 줄이지 않고, 크기도, 프레임도 변경하지 않는다는 점이다. 대신 화면에 아주 가는 마스크(그리드)가 생긴다. 숫자가 커질수록 더 많이 줄어들지만, 마스크도 더 선명해진다. 가벼운 사용(예: --lossy=30~40)을 하면, 정상적인 시청 거리에서는 거의 눈치채지 못한다.

3. 색상 수 감소: 256색을 128색 또는 64색으로

팔레트를 256색에서 128색, 혹은 64색으로 줄이면 각 픽셀이 필요로 하는 정보가 줄어들고 압축 효율이 상승한다.

플랫한 일러스트, 아이콘 애니메이션, UI 화면 녹화에는 색상이 적기 때문에 손실이 거의 없지만, 사진이나 그라데이션이 많은 화면에서는 색상 대역과 얼룩이 명확하게 나타난다.

4. 프레임 드롭(삭제): 프레임 레이트 낮추기

많은 GIF는 30fps 또는 60fps로 내보내지만, GIF는 고 프레임 레이트에 적합하지 않다. 대부분의 상황에서 10~15fps는 충분하다.

프레임 수를 절반으로 줄이면 용량도 거의 절반으로 줄어든다. 대신 애니메이션이 더 끊기는 느낌이 든다. 화면 녹화에는 큰 문제가 되지 않지만, 부드러운 움직임이 필요한 애니메이션에는 눈에 띈다.

5. 크기 축소

용량은 픽셀 수와 거의 비례한다. 가로와 세로를 절반씩 줄이면 픽셀 수는 1/4로 줄어든다.

Retina 화면에서 녹화한 경우 원본 너비가 2000픽셀 이상일 수 있지만, 실제로는 600~800픽셀 정도의 너비로 표시된다. 실제 표시 크기에 맞춰 내보내면 보통 가장 큰 효과를 볼 수 있다. 대신 확대했을 때 흐릿해질 수 있으며, 텍스트가 들어간 내용은 가독성을 주의해야 한다.

6. 포맷 변경: GIF를 비디오나 WebP로

플랫폼에서 지원한다면 가장 완벽한 방법은 GIF를 사용하지 않는 것이다:

  • MP4 / WebM: 현대 비디오 인코딩은 프레임 간 압축을 지원하므로, 같은 내용의 용량이 GIF의 몇 분의 1에 불과한 경우가 많다. 웹에서 <video autoplay loop muted playsinline>를 사용하면 GIF와 같은 효과를 낼 수 있다.
  • 동적 WebP / APNG: 더 많은 색상과 더 나은 압축을 지원하며, 현대 브라우저에서 모두 재생 가능하다.

대신 호환성이 문제다. 많은 채팅 앱, 포럼, 문서 도구, 이메일 클라이언트는 GIF만 지원하므로, 포맷을 바꾸면 표시되지 않거나 자동 재생이 안 될 수 있다.


표로 핵심은 한눈에

방법 화질 영향 적합 부적합
프레임 최적화 없음, 픽셀 변화 없음 모든 GIF, 특히 화면 녹화와 부분 애니메이션 ——(항상 수행해야 함)
손실 LZW(가벼움) 아주 미세한 마스크 대부분의 GIF 마스크에 매우 민감한 픽셀 아트
색상 수 감소 그라데이션에서 색상 대역 발생 플랫 일러스트, 아이콘, UI 사진, 그라데이션이 많은 화면
프레임 드롭(삭제) 애니메이션이 끊김 화면 녹화, 정적인 애니메이션 부드러운 움직임이 필요한 애니메이션
크기 축소 디테일 감소 원본이 표시 크기보다 훨씬 큰 경우 작은 글씨를 읽어야 하는 내용
포맷 변경 보통 더 좋음 웹, 직접 제어 가능한 플랫폼 GIF만 지원하는 플랫폼

순서의 논리는 손실이 없거나 거의 없는 것부터, 그다음에 필요한 대로 내려가는 것이다. 앞 두 단계만으로도 충분히 작아졌다면, 색상, 프레임 레이트, 크기를 희생할 필요가 없다.


앞 두 단계는 ImgZilla로 일괄 처리 가능

많은 GIF 파일(이모티콘 모음, 문서의 데모 애니메이션, 웹사이트 자료 폴더)이 있다면, 일일이 파라미터를 조정하는 것은 지루한 일이다.

ImgZilla는 macOS용 이미지 압축 도구로, 위 표의 앞 두 가지 방법을 사용한다:

  • gifsicle 기반: 최고 수준의 프레임 최적화(相当于 -O3)를 먼저 수행한 뒤, 가벼운 손실 LZW(相当于 --lossy=40)를 더한다.
  • 색상 수, 프레임, 크기, 루프 설정은 변경하지 않는다. 애니메이션은 그대로이고, 프레임 레이트, 길이, 해상도도 변하지 않으며, 파일 크기만 줄어든다.
  • 원본 위치 압축: 파일 이름, 경로, 포맷은 그대로다. 문서, 웹, Markdown에서 참조하는 demo.gif를 압축해도 여전히 demo.gif이며 링크를 수정할 필요가 없다.
  • 폴더 전체 드래그 앤 드롭: 하위 폴더를 재귀적으로 스캔하며, GIF뿐만 아니라 JPG, PNG, WebP 등 다른 이미지도 함께 처리한다.
  • 압축할 수 없으면 강제하지 않음: 이미 최적화되어 압축률이 0.4% 미만인 파일은 '최소화 완료'로 표시되며 원본을 그대로 유지하며, 무료 할당량도 차감하지 않는다.
  • 기본적으로 휴지통으로 이동: 결과에 만족하지 않으면 우클릭 '원본 복원'으로 되돌릴 수 있다.
  • 로컬에서 실행: 모든 처리가 로컬에서 이루어지며 서버로 업로드하지 않으므로, 일부 온라인 도구처럼 파일 크기나 개수의 제한이 없다. 수십 MB짜리 화면 녹화 GIF도 처리할 수 있다.

얼마나 줄일 수 있을지는 원래 GIF가 어떻게 내보내졌는지에 달려 있다. 프레임 최적화를 하지 않았고 대부분 정적인 화면 녹화 GIF는 보통 가장 많이 줄어들며, 이미 전문 도구로 압축한 GIF는 아주 적은 여유만 남을 수 있다. 심지어 '최소화 완료'로 표시될 수도 있다. 이는 정상적인 현상이다.

ImgZilla가 하지 않는 것

'애니메이션의 모양이 변하지 않게' 하기 위해 ImgZilla은 3~6단계는 수행하지 않는다. 앞 두 단계로도 여전히 너무 크다면, 특정 플랫폼의 한도 내로 강제로 줄여야 한다면 사용자가 어떤 것을 희생할지 결정해야 한다:

bash

gifsicle 명령줄 사용: 색상을 128로, 너비를 640으로 축소, 더 강한 손실 압축

gifsicle -O3 --lossy=80 --colors 128 --resize-width 640 input.gif -o output.gif

ffmpeg를 사용해 GIF를 MP4로 변환(용량이 보통 훨씬 작음)

ffmpeg -i input.gif -movflags +faststart -pix_fmt yuv420p
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4

프레임을 선택하거나 길이를 자르는 등의 작업은 ezgif 같은 온라인 편집기가 더 직관적이다.


더 좋은 습관: 원천에서 큰 GIF를 만들지 않기

다음 세 가지 팁은 나중에 반복해서 압축해야 하는 것을 줄여준다:

  1. 화면 녹화 전 창 크기 조절: 필요한 영역만 녹화하고, Retina 화면 전체를 녹화하지 마라.
  2. 내보낼 때 10~15fps 선택: 대부분의 데모에는 이 정도면 충분하다.
  3. 내보낸 뒤 바로 압축: 프레임 최적화와 가벼운 손실 LZW를 수행한다. 이 단계는 어떤 판단도 필요 없으며, 도구가 일괄로 처리하기에 적합하다.

GIF는 구형 포맷이지만, 여전히 '어디서든 자동으로 재생'되는 최대 공약수다. 포맷을 포기할지 고민하기보다, 모든 GIF가 자신에게 맞는 공간만 차지하도록 하는 것이 좋다.

ImgZilla는 현재 macOS(12.3 이상)만 지원하며 Mac App Store에서 다운로드할 수 있다. 무료 버전은 하루에 10장까지 압축할 수 있으며, 성공적인 압축에만 할당량이 적용된다. GIF로 가득 찬 폴더를 드래그해 보면 얼마나 절약할 수 있는지 확인해 보라.

이미지를 더 작고 빠르게

ImgZilla를 내려받아 기기에서 바로 압축하세요. 이미지는 클라우드로 전송되지 않습니다.