이미지 파일 압축 방법
jpg나 png 이미지 형식을 압축을 어떻게 하는건지 자세히 설명해줘
C
Claude

이미지 압축의 원리

JPG — Lossy Compression  |  PNG — Lossless Compression

JPG vs PNG 압축 원리 비교 다이어그램 JPG는 손실 압축, PNG는 무손실 압축을 사용하는 방식을 보여주는 흐름도 JPG (손실 압축) PNG (무손실 압축) 원본 이미지 (RGB) 색공간 변환 RGB → YCbCr 색차 다운샘플링 Cb·Cr 해상도 절반 축소 DCT 변환 8×8 블록 → 주파수 계수 양자화 ★ 손실 발생 계수 ÷ 양자화 테이블 → 반올림 엔트로피 코딩 허프만 코딩으로 비트 압축 .jpg 파일 출력 원본 이미지 (RGBA) 스캔라인 필터링 None·Sub·Up·Avg·Paeth 중 선택 DEFLATE 압축 LZ77: 반복 패턴 참조 허프만: 빈도 기반 비트 축소 PNG 청크 패키징 IHDR · IDAT · IEND .png 파일 출력 압축률: ★★★★★ 품질 손실 있음 · 사진에 최적 압축률: ★★★☆☆ 완벽 복원 · 투명도 지원

JPG 압축 단계별 설명

① 색공간 변환 (RGB → YCbCr)

사람 눈은 밝기(Y)에 민감하고 색상(Cb, Cr)에 덜 민감합니다. JPG는 이 특성을 이용해 색상 채널을 따로 처리합니다.

② 색차 다운샘플링

Cb·Cr 채널의 해상도를 가로·세로 절반으로 줄입니다. 픽셀 4개당 색상 정보 1개만 저장하므로 데이터가 크게 줄고, 사람 눈에는 거의 차이가 없습니다.

③ DCT 변환 (Discrete Cosine Transform)

이미지를 8×8 픽셀 블록으로 나눈 뒤, 각 블록을 공간 영역에서 주파수 영역으로 변환합니다. 저주파(전체적인 밝기/색)는 앞쪽에, 고주파(세밀한 경계)는 뒤쪽에 배치됩니다.

④ 양자화 ← 핵심 손실 지점

DCT 계수들을 미리 정해진 "양자화 테이블"로 나누고 반올림합니다. 고주파 성분일수록 큰 값으로 나누므로 0으로 수렴하는 계수가 많아집니다. 품질(quality) 설정이 바로 이 테이블의 강도를 조절하는 것입니다. 재압축할수록 품질이 열화되는 이유가 여기 있습니다.

⑤ 허프만 코딩

자주 등장하는 값에 짧은 비트열을, 드문 값에 긴 비트열을 할당해 최종적으로 비트 수를 줄입니다.


PNG 압축 단계별 설명

① 스캔라인 필터링

각 픽셀을 절댓값 대신 주변 픽셀과의 차이로 표현합니다. 필터 종류는 5가지(None, Sub, Up, Average, Paeth)이며, 인코더가 각 줄마다 가장 효율적인 필터를 선택합니다. 차이값은 숫자가 작아 이후 압축이 잘 됩니다.

② DEFLATE (LZ77 + 허프만 코딩)

LZ77: 이전에 나온 패턴이 반복될 경우 "N바이트 전으로 돌아가서 M바이트 복사"라는 참조로 대체합니다. 단색 배경처럼 반복 패턴이 많을수록 효율이 극대화됩니다.

허프만 코딩: JPG와 동일하게 자주 나오는 값에 짧은 코드를 부여합니다.

이 과정에서 데이터 손실이 전혀 없으므로 압축을 몇 번 해도 품질이 그대로입니다.


언제 어떤 포맷을 쓸까?

상황 권장 포맷 이유
사진, 자연 이미지 JPG 색상 변이가 많아 손실이 눈에 띄지 않음
로고, 텍스트, 아이콘 PNG 선명한 경계 보존, 투명도 지원
스크린샷 (UI) PNG 글자·픽셀 경계 선명하게 유지
웹 사진 (용량 중요) JPG q=75~85 파일 크기 대비 화질 최적
투명 배경 필요 PNG JPG는 투명도 미지원