ZeroTool Workbench
GIF 압축기
업로드 없이 GIF를 압축하세요. 손실 LZW, 색상 수 줄이기, 크기 조절, 프레임 건너뛰기를 지원하며 압축 전후 용량을 브라우저에서 바로 비교합니다.
사용 방법
- GIF를 드롭 영역에 놓거나 클릭해서 선택합니다. 복사한 GIF 파일을 Ctrl/Cmd+V로 붙여넣어도 됩니다.
- 불러오면 지금 설정으로 한 번 자동 압축하고, 원본과 결과를 나란히 보여 주며 두 파일 크기를 표시합니다.
- 설정을 바꾼 뒤 ‘압축’을 눌러 다시 만듭니다. 인코딩은 무거운 작업이라 슬라이더를 움직일 때마다 다시 계산하지 않습니다.
- ‘GIF 다운로드’를 누르면
{원래 이름}-compressed.gif로 저장됩니다.
설정별 용량 변화
| 설정 | 하는 일 | 용량에 미치는 영향 |
|---|---|---|
| 손실 압축 (0–100, 기본 40) | 색 차이가 ‘손실 압축 × 0.6’ 이내면 LZW가 기존 나열을 재사용 | 영상에서 만든 GIF에 가장 효과가 큰 항목. 231프레임 화면 녹화 기준 40에서 원본의 42%, 100에서 19% |
| 색상 수 (256~4) | 색상표 크기. 1칸은 투명용 | 색이 적을수록 코드가 짧아지고 반복이 늘어남. 원본 색상 수가 한도 이내면 팔레트는 원래 색 그대로 |
| 너비 | 비율을 유지해 축소하며 높이는 자동 | 픽셀 수는 축소 비율의 제곱으로 줄어듦. 너비를 절반으로 하면 데이터는 약 4분의 1 |
| 프레임 | 2·3·4프레임마다 1장만 남김 | 저장할 프레임이 줄어듦. 남긴 프레임은 건너뛴 프레임의 시간까지 표시하므로 전체 길이는 그대로 |
| 디더링 | Floyd–Steinberg 오차 확산 | 색이 적을 때 그라데이션이 부드러워지지만 파일은 대개 커짐 |
너비는 줄이기만 할 수 있습니다. 빈칸, 0, 원래 너비보다 큰 값은 모두 원래 너비로 처리합니다. 축소할 때는 출력 픽셀이 덮는 원본 픽셀을 면적 가중 평균합니다. 불투명한 부분이 절반에 못 미치는 출력 픽셀은 투명이 됩니다.
프레임 지연은 10ms 단위로 쓰며 최소 20ms입니다. 원본에서 0 또는 10ms인 프레임은 100ms로 씁니다. 브라우저가 실제로 그렇게 재생하기 때문입니다.
프레임 최적화 원리
GIF의 각 프레임이 캔버스 전체를 덮을 필요는 없습니다. 이 도구는 첫 프레임만 전체를 쓰고, 이후 프레임은 화면에 보이는 내용과 비교해 바뀐 픽셀을 담은 가장 작은 사각형만 씁니다. 사각형 안에서 바뀌지 않은 픽셀은 투명색으로 써서 이전 프레임이 비쳐 보이게 하고, 긴 연속 구간으로 묶어 압축합니다. 전혀 바뀌지 않은 프레임은 투명 픽셀 1개만 쓰고 지연 시간을 유지합니다.
투명 픽셀은 한 단계가 더 필요합니다. 보이던 픽셀을 투명하게 바꿔야 할 때, 그 위에 투명 픽셀을 그려도 아무 변화가 없습니다. 그래서 바로 앞 프레임의 처리 방식(disposal)을 2(배경으로 복원)로 정하고, 그 사각형을 해당 픽셀까지 넓힙니다. 브라우저는 다음 프레임을 그리기 전에 그 영역을 지웁니다.
팔레트는 애니메이션 전체에 대해 한 번만 만듭니다. 모든 프레임이 쓰는 색이 색상표에 들어가면 색을 그대로 유지하고, 들어가지 않으면 미디언 컷으로 색 공간을 상자로 나눠 상자마다 평균색을 씁니다.
지원 범위
- 결과는 항상 GIF입니다. WebP 변환기는 GIF의 첫 프레임을 정지 WebP로 바꿉니다. 움직이는 WebP가 필요하면 컴퓨터에서 libwebp에 포함된
gif2webp를 쓰세요.
gif2webp -lossy -q 75 in.gif -o out.webp
- MP4는 같은 내용의 GIF보다 몇 배 작은 경우가 많습니다. 컴퓨터의 ffmpeg로 변환하세요. 가로나 세로가 홀수이면 yuv420p가 짝수 크기를 요구하므로
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"를 추가합니다.
ffmpeg -i in.gif -movflags +faststart -pix_fmt yuv420p out.mp4
- 프레임 자르기, 순서 바꾸기, 편집은 할 수 없습니다. GIF를 PNG 프레임으로 나누려면 GIF 프레임 추출기를 쓰세요.
- 크기 한도: 디코딩 후 5,000만 픽셀, 1,000프레임, 프레임당 16,777,216픽셀.
- JPEG·PNG·WebP 이미지는 이미지 압축기를 이용하세요.
관련 도구
- GIF 프레임 추출기: 프레임을 PNG·JPG로 내보내거나 스프라이트 시트를 만듭니다.
- 이미지 압축기: JPEG, PNG, WebP 압축과 크기 조절.
- WebP 변환기: PNG, JPG 또는 GIF 첫 프레임을 WebP로 변환.
FAQ
GIF가 서버에 업로드되나요?
아니요. 파일은 File API로 읽고, 이 페이지의 JavaScript가 브라우저 안에서 디코딩과 재인코딩을 한 뒤 결과를 메모리에서 바로 내려받습니다. 로컬에 저장하는 것은 설정(손실 압축, 색상 수, 프레임, 디더링)뿐이며, 너비는 파일마다 정해지므로 저장하지 않습니다. 원본 GIF와 압축 결과는 어디에도 저장되지 않습니다.
'손실 압축' 슬라이더는 무엇을 하나요?
GIF는 픽셀을 LZW로 압축합니다. 픽셀 나열이 앞에서 나온 나열을 많이 반복할수록 파일이 작아집니다. 손실 압축 값이 0보다 크면, 인코더는 사전에 있는 나열을 이어 갈 수 있을 때 픽셀을 가까운 팔레트 색으로 바꿔 씁니다. 허용하는 최대 색 차이는 '손실 압축 × 0.6'(RGB 공간의 거리)으로, 기본값 40이면 24, 100이면 60입니다. 프레임 사이에서는 화면에 보이는 픽셀과의 거리가 이 범위 안이면 바뀌지 않은 것으로 보고 다시 그리지 않습니다. 투명 픽셀은 바뀌지 않습니다. 0이면 픽셀을 그대로 씁니다.
압축 결과가 원본보다 커질 때가 있는 이유는?
gifsicle -O3로 이미 최적화했거나, 프레임마다 별도 색상표를 쓰는 GIF가 있기 때문입니다. 이 도구는 모든 프레임이 함께 쓰는 팔레트 하나만 쓰며, 최대 255색과 투명 1칸입니다. 원본이 256색을 모두 쓰거나 프레임마다 색이 다르면 색을 다시 줄여야 하므로 용량이 늘 수 있습니다. 그럴 때는 페이지에 안내가 나오고, 파일은 그대로 내려받을 수 있습니다. 더 작게 만들려면 색상 수를 줄이거나, 손실 압축을 높이거나, 너비를 줄여 보세요.
얼마나 큰 GIF까지 처리하나요?
디코딩 후 5,000만 픽셀(가로 × 세로 × 프레임 수), 1,000프레임, 프레임당 16,777,216픽셀(한 변 16,384px)까지입니다. GIF 프레임 추출기와 같은 한도로, 휴대폰 메모리 안에서 동작하도록 정했습니다. 더 큰 파일은 컴퓨터에서 gifsicle -O3 --lossy=80 --colors 128 input.gif -o output.gif를 실행하세요.
디더링이 기본으로 꺼져 있는 이유는?
디더링은 이웃한 팔레트 색의 픽셀을 흩뿌려 팔레트에 없는 색을 흉내 냅니다. 이 점 패턴은 화면이 멈춰 있는 부분에서도 프레임마다 달라지므로, 바뀌지 않은 것으로 볼 수 있는 픽셀이 크게 줄고 LZW도 반복을 찾기 어려워집니다. 231프레임 화면 녹화에서 64색으로 디더링을 켜자 결과가 1.9배(원본의 42%에서 80%)가 되었습니다. 색상 수가 적어 그라데이션에 띠가 심하게 보일 때만 켜는 것이 좋습니다.