Blog · 가이드

무손실 이미지 압축은 실제로 어떻게 작동할까

왜 더 작은 파일이 원본과 픽셀 단위로 완전히 동일할 수 있는지 — 그리고 이를 가능하게 하는 예측, 모델링, 엔트로피 코딩 기법을 알아봅니다.

in == out · fewer bytes

“무손실”이라는 말은 모순처럼 들립니다. 아무것도 버리지 않고 어떻게 파일이 더 작아질 수 있을까요? 비결은 이미지가 <b>중복성</b>으로 가득 차 있다는 데 있습니다. 압축이란 같은 픽셀을 더 적은 비트로 표현하는 기술입니다. 디코딩하면 모든 원본 값을 정확히, 비트 단위까지 그대로 되돌려받습니다.

“무손실”이 정말로 의미하는 것

JPEG 같은 손실 포맷은 눈으로 알아채기 어려운 정보를 버립니다. 무손실 압축은 <i>아무것도</i> 버리지 않습니다. 디코딩된 이미지는 입력과 완전히 동일합니다. 그래서 스크린샷, 라인 아트, 로고, UI 에셋, 아카이브용 마스터본에는 무손실이 정답입니다 — 픽셀 하나가 어긋나는 것조차 반올림 오차가 아니라 버그가 되는 영역이니까요.

1단계: 데이터를 더 잘 모델링하기

원본 픽셀은 낭비가 많습니다. 이웃 픽셀끼리 상관관계가 매우 높기 때문입니다 — 왼쪽 픽셀은 대개 현재 픽셀을 예측하는 훌륭한 단서가 됩니다. 무손실 코덱은 이웃 픽셀로부터 각 픽셀을 <b>예측</b>하고, 작은 오차(잔차)만 저장합니다. PNG는 이를 <i>필터</i>(Sub, Up, Average, Paeth)라고 부릅니다. 예측이 정확할수록 잔차는 0 근처로 몰리고, 0에 가까운 값은 압축이 매우 잘됩니다.

2단계: 엔트로피 코딩

데이터가 대체로 작고 반복적인 잔차로 바뀌면, <b>엔트로피 코더</b>가 흔한 값에는 짧은 코드를, 드문 값에는 긴 코드를 부여합니다. PNG는 DEFLATE(LZ77 + 허프만)를 사용하고, WebP 무손실이나 JPEG XL 같은 최신 코덱은 컨텍스트 모델링과 산술 코딩 또는 ANS 코딩을 사용해 이론적 한계에 더 가깝게 압축합니다. 포맷은 달라도 아이디어는 같습니다. 예측 가능한 부분에는 더 적은 비트를 쓰는 것이죠.

도구
기능
oxipng
PNG 필터 조합을 시도하고 DEFLATE를 재압축
zopfli
더 느리지만 더 작은 스트림을 찾아내는 DEFLATE
WebP -lossless
예측 + 색상 변환 + 산술 코딩
JPEG XL -d 0
최고의 압축률; JPEG 트랜스코딩도 가능

도구가 필요한 지점

이것이 같은 이미지의 무손실 PNG 두 개가 크기 면에서 크게 달라질 수 있는 이유입니다. 픽셀은 동일하지만, 인코더가 그것을 표현하는 데 더 많은 노력을 기울였기 때문입니다. <b>oxipng</b>는 필터 전략을 탐색하고 재압축하며, <b>zopfli</b>는 훨씬 느리지만 흔히 몇 퍼센트를 더 깎아내는 DEFLATE입니다. WebP와 JPEG XL은 아예 더 똑똑한 모델을 가져옵니다. 셋 다 픽셀 자체는 건드리지 않습니다.

# 무손실, 최대 effort — 픽셀은 동일, 파일은 더 작게
imageforge logo.png --lossless --effort max
imageforge ui-export.png --convert webp --lossless

솔직한 한계

무손실 압축에도 한계는 있습니다. 실제 장면을 담은 사진에는 진짜 고주파 디테일(센서 노이즈, 미세한 질감)이 담겨 있어 예측이 잘 안 되므로, 여기서는 무손실의 이득이 크지 않습니다. 이때가 바로 손실 포맷이 제 몫을 하는 순간입니다. 반면 평면적이거나 합성된, 텍스트가 많은 이미지라면 무손실 압축은 화질 손실 없이 흔히 30~70%를 줄여냅니다. 관건은 내 이미지가 어느 쪽에 속하는지 아는 것입니다.

픽셀 하나 건드리지 않고 PNG 용량을 줄이세요.

ImageForge가 oxipng, zopfli, 최신 무손실 인코더를 로컬에서 대신 실행합니다.

계속 읽기