이미지 저장의 근본 문제
압축하지 않은 원시 디지털 이미지는 모든 픽셀의 색상값을 그대로 저장합니다. 1200만 화소 카메라 사진은 RGB 각 채널에 8비트를 쓰면 약 36MB의 원시 저장 공간이 필요합니다. 이 크기 그대로 이미지를 전송하고 보관하는 것은 비현실적입니다. 압축 알고리즘은 자연 이미지의 두 가지 특성을 활용해 극적인 크기 감소를 달성합니다. 공간 중복성(인접 픽셀은 비슷한 값을 가지는 경향)과 지각적 중복성(인간의 눈은 센서가 포착하는 모든 세부 정보를 인식하지 못함)입니다.
JPEG: 이산 코사인 변환(DCT)
JPEG(Joint Photographic Experts Group) 압축은 1992년에 표준화됐으며 현재까지 사진에 가장 널리 쓰이는 포맷입니다. DCT(이산 코사인 변환)를 사용해 픽셀 데이터를 주파수 성분으로 변환합니다.
과정은 단계적입니다. 먼저 이미지를 RGB 색공간에서 YCbCr로 변환합니다. 이는 휘도(밝기)와 색차(색상)를 분리합니다. 인간의 눈이 밝기 변화에는 민감하지만 색상 변화에는 덜 민감하기 때문에, 색상 채널을 크게 다운샘플링해도 눈에 거의 띄지 않습니다. 이를 크로마 서브샘플링이라고 합니다.
다음으로 이미지를 8×8 픽셀 블록으로 나눕니다. 각 블록에 DCT를 적용하면 64개의 픽셀값이 64개의 주파수 계수로 변환됩니다. 좌상단 계수는 블록의 평균 색상(DC 성분)을 나타내고, 나머지 계수들은 점점 더 세밀한 공간 세부 정보(AC 성분)를 나타냅니다.
이 주파수 계수들은 양자화 테이블의 단계 크기로 나눠 반올림됩니다. 세밀한 세부 정보를 나타내는 고주파 계수는 공격적으로 양자화되어(큰 수로 나뉘어) 눈에 거의 보이지 않는 미묘한 변화가 버려집니다. 넓은 색상 영역을 나타내는 저주파 계수는 더 부드럽게 양자화됩니다.
양자화된 값들은 허프만 코딩으로 엔트로피 압축됩니다. JPEG 품질 슬라이더는 양자화 테이블을 조정합니다. 품질이 낮을수록 단계 크기가 커지고 더 공격적으로 반올림됩니다.
JPEG가 낮은 품질에서 블록 아티팩트를 만드는 이유가 바로 이것입니다. 8×8 블록이 보이기 시작하는 것은, 본래 부드럽게 이어져야 할 인접 블록 경계가 거친 양자화로 인해 세부 정보를 잃어 갑자기 끊기기 때문입니다.
PNG: DEFLATE와 필터링
PNG(Portable Network Graphics)는 1995년에 GIF의 무손실 대체재로 설계됐습니다. 필터링과 DEFLATE 압축, 두 단계를 통해 압축합니다.
압축 전, PNG는 각 픽셀 행에 필터를 적용합니다. "Sub"(각 픽셀에서 왼쪽 픽셀을 뺀 값), "Up"(각 픽셀에서 위 픽셀을 뺀 값), "Paeth"(두 이웃과 대각선 이웃을 조합) 같은 필터들이 픽셀값을 차이값으로 변환합니다. 이 차이값들은 0 근처에 모인 작은 숫자들이라 원래 절댓값보다 훨씬 압축하기 좋습니다.
필터링된 데이터는 ZIP 파일에 쓰이는 알고리즘인 DEFLATE로 압축됩니다. DEFLATE는 LZ77(반복 패턴을 찾아 역참조로 대체)과 허프만 코딩을 결합합니다. 자연 이미지에서는 비슷한 텍스처, 반복되는 그라데이션, 공통 형태 등 같은 색상 패턴이 자주 반복되는데, LZ77 역참조가 이 중복성을 효율적으로 포착합니다.
PNG 압축은 완전한 무손실입니다. 압축 해제 시 원본 픽셀값이 정확히 복원됩니다. 선명한 경계, 텍스트, 로고, 정확한 픽셀값이 중요한 모든 콘텐츠에 PNG가 이상적인 이유입니다. 사진의 경우 동등한 품질에서 JPEG보다 훨씬 큰 파일이 만들어집니다.
WebP: VP8 예측 코딩
WebP는 구글이 VP8 비디오 코덱을 기반으로 개발했습니다. 손실 모드는 JPEG의 DCT 방식보다 더 정교한 블록 예측을 사용합니다.
이미지를 매크로블록(최대 16×16픽셀)으로 나눕니다. 각 매크로블록에 대해 인코더는 여러 예측 모드를 시도합니다. 왼쪽 이웃에서 외삽, 위 이웃에서 외삽, 두 가지 조합, 또는 이웃의 평균을 사용하는 DC(평탄) 예측입니다. 실제 매크로블록 내용에 가장 가까운 예측을 선택합니다.
실제로 저장해야 하는 것은 잔차, 즉 예측값과 실제 블록의 차이입니다. 예측이 정확한 영역은 잔차가 작아 매우 효율적으로 압축됩니다. 이 예측 메커니즘 덕분에 WebP가 동등한 시각적 품질에서 JPEG보다 25~35% 더 나은 압축률을 달성하는 이유입니다.
무손실 WebP는 LZ77+허프만+색상 캐시라는 완전히 다른 알고리즘을 사용합니다. PNG와 달리 예측자가 행이 아닌 2D 블록에 적용되어 더 복잡한 패턴 매칭이 가능합니다.
무손실 vs 손실: 근본적인 차이
무손실 압축은 원본 데이터의 모든 비트를 보존합니다. 압축 해제된 파일은 입력과 바이트 단위로 동일합니다. PNG와 무손실 WebP는 무손실입니다. 얼마든지 압축·해제를 반복해도 항상 원본을 정확히 되찾을 수 있습니다.
손실 압축은 지각적으로 덜 중요하다고 판단된 데이터를 버립니다. 압축 해제된 파일은 원본의 근사치입니다. JPEG와 손실 WebP는 손실 방식으로, 압축 사이클마다 새로운 아티팩트가 도입됩니다. JPEG를 JPEG로 반복 저장하면(재압축) 점진적으로 화질이 떨어집니다.
실용적인 함의: 항상 원본 소스 파일을 무손실 또는 원시 포맷으로 보관하세요. JPEG나 손실 WebP로 내보내는 것은 배포용 최종 버전이 완성됐을 때만 하세요. JPEG를 추가 편집의 소스 파일로 쓰지 마세요.
알고리즘마다 성능이 다른 이유
JPEG의 DCT는 8×8 블록 구조 때문에 고대비 경계에서 약합니다. 부드럽고 점진적인 색상 전환이 있는 사진에는 잘 작동하지만, 블록 경계를 가로지르는 선명한 가장자리가 있는 텍스트, 만화, 선화에서는 좋지 않습니다.
PNG의 행 기반 필터링은 수평 패턴이 있는 그래픽에 잘 작동하지만, 복잡한 대각선이나 2차원 패턴에는 최적이 아닙니다.
WebP의 2D 블록 예측은 더 넓은 범위의 콘텐츠 유형을 처리하며 대부분의 경우 품질/크기 균형에서 JPEG와 PNG를 모두 능가합니다. 사진과 그래픽 모두를 포함한 대부분의 웹 용도에서 WebP는 현재 사용 가능한 가장 효율적인 현대 포맷입니다.