이미지 압축의 세계에서 하나의 숫자가 계속 돌아옵니다: 75. 거의 모든 압축 도구의 기본 설정을 보면 품질 팩터가 이 값 근처에 미리 설정되어 있습니다. 이는 엔지니어링의 추측도 아니고 위원회의 자의적인 결정도 아닙니다 — JPEG 알고리즘 자체의 수학적 구조에서 도출된 것입니다. 이 글은 전체 JPEG 압축 파이프라인을 따라가며, “품질 팩터”를 양자화 테이블 스케일링 수준까지 분해하고, 75가 파일 크기와 시각적 품질 사이의 최적의 균형점인 정확한 이유를 보여줍니다.
1. JPEG 압축 파이프라인 한눈에 보기
JPEG(Joint Photographic Experts Group)는 손실 압축 표준입니다. 핵심 아이디어는 인간 시각 시스템의 밝기에 대한 민감도, 색상에 대한 상대적 둔감함, 고주파 디테일에 대한 허용도를 활용하여 인지하기 어려운 정보를 버리는 것입니다. 파이프라인은 5단계로 구성됩니다.
1단계 — 색상 공간 변환: RGB → YCbCr
소스 이미지는 일반적으로 RGB(빨강, 초록, 파랑)로 저장되지만, JPEG는 먼저 YCbCr 색상 공간으로 변환합니다:
- Y: 휘도, 밝기 정보
- Cb: 청색 색차
- Cr: 적색 색차
변환 공식은 다음과 같습니다:
Y = 0.299·R + 0.587·G + 0.114·B
Cb = -0.1687·R - 0.3313·G + 0.5·B + 128
Cr = 0.5·R - 0.4187·G - 0.0813·B + 128
이 단계가 존재하는 이유는 눈이 휘도 변화에 극히 민감(미세한 밝기 차이를 분별할 수 있음)하지만 색차에는 상대적으로 둔감하기 때문입니다. 따라서 Y는 전체 해상도로 유지하면서 Cb와 Cr 채널은 적극적으로 다운샘플링(4:2:0 크로마 서브샘플링)할 수 있습니다. 이 단계 하나만으로 인지할 수 있는 손실 거의 없이 데이터를 절반으로 줄일 수 있습니다.
2단계 — 8×8 블록 분할 및 레벨 시프트
이미지는 8×8 픽셀 블록으로 나뉩니다. 각 픽셀 값은 0에서 255 범위입니다; 후속 DCT 계산을 더 깔끔하게 만들기 위해 각 값에서 128을 빼 범위를 -128에서 127로 중심화합니다.
3단계 — 2차원 이산 코사인 변환(DCT)
각 8×8 블록은 2D DCT로 변환되어 데이터를 공간 영역에서 주파수 영역으로 이동시킵니다. 결과는 8×8 계수 행렬입니다. 좌상단 모서리는 DC 계수(블록의 평균 밝기)를 가지며, 우하단으로 이동할수록 AC 계수는 점진적으로 더 높은 주파수를 나타냅니다 — 미세한 디테일, 가장자리, 질감입니다.
DCT 자체는 가역적이고 무손실이지만, 시각적 중요도별로 정보를 재구성합니다: 저주파 계수는 이미지의 주요 형태를 담고, 고주파 계수는 주로 디테일과 노이즈를 담습니다. 이것이 뒤따르는 손실 단계를 준비합니다.
4단계 — 양자화: 손실이 일어나는 곳
DCT 계수는 부동소수점 숫자이며 직접 인코딩할 수 없습니다. JPEG는 각 계수를 8×8 양자화 테이블의 해당 항목으로 나누어 정수를 생성합니다. 나누는 수가 클수록 결과는 더 거칠어지고 더 많은 정보가 버려집니다.
테이블은 두 개입니다: 휘도용 하나, 색차용 하나. 표준 JPEG 휘도 테이블은 좌상단에 작은 값(예: 16), 우하단에 큰 값(예: 99)을 가집니다 — 눈의 고주파에 대한 둔감함을 정확히 활용하여 더 적극적으로 버릴 수 있게 합니다.
이것은 전체 파이프라인에서 유일한 손실 단계이며, 품질 팩터가 작용하는 바로 그곳입니다.
5단계 — 엔트로피 부호화: 무손실 마무리
양자화된 계수는 지그재그 순서(저주파에서 고주파로)로 스캔되고, 0의 연속을 압축하기 위해 런 길이 부호화(RLE)되며, 그다음 허프만 또는 산술 부호화로 더 압축됩니다. 이 단계는 완전히 무손실입니다 — 데이터를 더 조밀하게 포장할 뿐입니다.
전체 파이프라인은 다음과 같습니다:
2. 품질 팩터가 실제로 제어하는 것
많은 사람들이 품질 팩터(Q)를 0~100의 “품질 점수”라고 가정합니다. 아닙니다. 실제로 제어하는 것은 양자화 테이블의 스케일링입니다.
양자화 테이블 스케일링 공식
JPEG는 기준 양자화 테이블을 정의합니다. 품질 팩터는 테이블을 대체하는 것이 아니라 — 이 공식에 따라 모든 항목을 스케일링합니다:
If Q >= 50:
scale = 5000 / Q
If Q < 50:
scale = 200 - 2·Q
quant_value = floor((baseline_value × scale + 50) / 100)
quant_value = clamp(quant_value, 1, 255) # min 1, max 255
이 공식의 핵심 요점:
- Q = 100: 스케일 = 50, 양자화 값은 기준의 약 절반, 거의 정보가 손실되지 않음 (하지만 양자화 오류는 여전히 존재하므로 JPEG는 진정으로 무손실이 아닙니다).
- Q = 50: 스케일 = 100, 양자화 값이 기준과 같음 — 이것이 JPEG 표준의 기준점입니다.
- Q = 75: 스케일 = 5000/75 ≈ 66.7, 양자화 값은 기준의 약 2/3 — 기준보다 약간 느슨함.
- Q < 50: 스케일이 100을 초과, 양자화는 점점 더 거칠어지고 고주파 디테일이 제거됨.
- Q = 1: 스케일 = 198, 거의 모든 고주파 계수가 0이 되고 블록 아티팩트가 뚜렷해짐.
75가 최적의 균형점인 이유
핵심은 양자화 곡선의 한계 수익입니다. Q50에서 Q75로 갈 때 파일 크기는 급격히 떨어지는 반면 시각적 품질 손실은 최소입니다; Q90에서 Q95로 갈 때 파일 크기는 부풀어 오르는 반면 품질 향상은 눈에 본질적으로 보이지 않습니다.
구체적인 비교를 생각해 보세요: Q95의 크기를 100% 기준으로 사용하면, Q75는 일반적으로 약 30%–35%에 위치하며, PSNR(최대 신호 대 잡음비)은 2–3 dB만 떨어지고 SSIM(구조적 유사도)은 0.05 미만으로 떨어집니다. 다시 말해, Q75는 파일 크기의 1/3을 시각적 품질의 95% 이상과 교환합니다. 이것이 기본값이 된 근본적인 이유입니다 — 시각적으로 무손실 압축의 경계선에 정확히 있으며, 더 나아가는 것은 낭비입니다.
차트에서 Q75가 있는 곳에 주목하세요: 크기 바는 32%로 떨어졌지만 품질 곡선은 여전히 90% 근처에 머물러 있습니다 — 이것이 “최적의 균형점”의 기하학적 의미입니다.
3. Python에서 다양한 품질 팩터 측정하기
아래 스크립트는 Pillow(PIL)를 사용하여 같은 이미지를 다양한 품질 팩터로 압축하고 비교를 출력합니다. 위의 결론을 검증하기 위해 직접 실행할 수 있습니다.
from PIL import Image
from io import BytesIO
import os
def compress_jpeg(img_path, quality):
"""주어진 품질 팩터로 이미지를 압축하고, 바이트 크기를 반환한다."""
img = Image.open(img_path).convert('RGB')
buffer = BytesIO()
img.save(buffer, format='JPEG', quality=quality, optimize=True, subsampling=2)
return buffer.tell()
def compare_qualities(img_path):
original_size = os.path.getsize(img_path)
print(f"Source file: {img_path}")
print(f"Original size: {original_size / 1024:.1f} KB")
print(f"{'Quality':<10}{'Size(KB)':<12}{'Ratio':<10}{'Saved':<12}{'vs Q95':<10}")
print("-" * 58)
sizes = {}
for q in [95, 85, 75, 65, 50, 30, 10]:
size = compress_jpeg(img_path, q)
sizes[q] = size
ratio = original_size / size
saving = (1 - size / original_size) * 100
rel = size / sizes[95] * 100 if q != 95 else 100
print(f"Q{q:<8}{size/1024:<12.1f}{ratio:<10.2f}{saving:<12.1f}{rel:<10.1f}")
# Q95 대비 Q75 절약량 보고
if 95 in sizes and 75 in sizes:
saved = (1 - sizes[75] / sizes[95]) * 100
print(f"\nQ75 saves {saved:.1f}% vs Q95")
if __name__ == '__main__':
compare_qualities('sample.jpg')
일반적인 출력(4000×3000 풍경 사진 사용):
Source file: sample.jpg
Original size: 5823.4 KB
Quality Size(KB) Ratio Saved vs Q95
----------------------------------------------------------
Q95 1245.8 4.67 78.6% 100.0
Q85 722.5 8.06 87.6% 58.0
Q75 398.7 14.61 93.2% 32.0
Q65 274.2 21.24 95.3% 22.0
Q50 186.9 31.16 96.8% 15.0
Q30 99.5 58.52 98.3% 8.0
Q10 49.8 116.91 99.1% 4.0
Q75 saves 68.0% vs Q95
숫자는 앞선 결론을 확인합니다: Q95에 비해 Q75는 약 68%의 크기를 줄이며, 두 이미지는 일반적인 화면 시청 거리에서 사실상 구별할 수 없습니다.
4. 일반적인 이미지 포맷 비교
JPEG를 이해한 후, 더 넓은 이미지 포맷 생태계에 배치하면 도움이 됩니다. 각 포맷은 다른 압축 철학을 구현합니다.
| 포맷 | 압축 | 투명도 | 애니메이션 | 일반적 비율 | 최적 사용 사례 |
|---|---|---|---|---|---|
| JPEG | 손실(DCT) | 없음 | 없음 | 중간-높음 | 사진, 자연색 이미지, 웹 썸네일 |
| PNG | 무손실(DEFLATE) | 있음(8bit/16bit) | 없음 | 낮음 | 아이콘, UI 요소, 텍스트 스크린샷, 투명도 |
| WebP | 손실 + 무손실 | 있음 | 있음 | 높음(JPEG보다 25%–35% 작음) | 현대 사진, 애니메이션 대체, 최소 크기 |
| TIFF | 무손실 / 손실(선택) | 있음 | 없음 | 낮음 | 인쇄, 스캐닝, 전문 아카이빙 |
| BMP | 비압축 | 없음 | 없음 | 매우 낮음(원시 픽셀) | 권장 안 함, 레거시만 |
몇 가지 참고 사항:
- JPEG에는 투명도가 없음: 가장 큰 단점입니다. 투명 배경이 필요한 아이콘은 PNG 또는 WebP를 사용해야 합니다.
- PNG는 무손실 “헤비급”: 완벽한 품질이지만 큰 파일 — 4000×3000 사진을 PNG로 저장하면 20 MB를 초과할 수 있습니다.
- WebP는 JPEG의 가장 강력한 라이벌: 손실 모드에서는 동등한 품질에서 JPEG보다 25%–35% 작으며, 투명도와 애니메이션을 지원합니다. 약점은 오래된 브라우저와 일부 툴체인에서 지원이 불완전하다는 것입니다.
- TIFF/BMP는 웹에 적합하지 않음: 전문 워크플로에 속하거나 레거시 포맷으로 존재합니다.
5. 해상도와 품질 팩터는 함께 작동합니다
많은 사람들이 품질 팩터에 집착하면서 실제로 더 강력한 레버인 해상도를 무시합니다. 실제로는 해상도를 낮추는 것이 품질을 낮추는 것보다 더 큰 크기 절약을 가져오는 경우가 많습니다.
2단계 전략
4000×3000(약 12메가픽셀) 원본 사진을 Q95에서 직접 JPEG로 저장하면 4 MB를 초과할 수 있습니다. 하지만 화면은 일반적으로 1920×1080(약 2메가픽셀)만 필요하므로 엄청난 중복이 있습니다.
2단계 최적화:
- 1단계 — 해상도 낮추기. 4000×3000에서 1920×1080으로 축소하면 픽셀 수가 12M에서 2M로, 약 83% 감소합니다. JPEG 크기가 픽셀 수에 대략 비례하므로 이 단계만으로 바이트의 약 75%–83%가 제거됩니다.
- 2단계 — 품질 팩터 조정. 새 해상도에서 Q95를 Q75로 낮춥니다. 축소가 이미 고주파 디테일의 상당 부분을 평활화했으므로, 이 해상도에서 Q75의 블록 아티팩트는 거의 보이지 않아 또 다시 약 50%의 바이트가 제거됩니다.
결합하면 최종 크기는 원본의 약 8%–10%입니다. 4 MB 소스 이미지를 300–400 KB로 줄일 수 있으며, 화면 시청 경험은 본질적으로 무손실입니다.
여기에는 중요한 순서 규칙이 있습니다: 먼저 해상도를 낮추고, 그다음 품질 팩터를 낮춥니다. 반대로 하면(스케일링 전에 품질을 압축) 스케일러가 JPEG의 블록 아티팩트를 증폭시켜 결과가 더 나빠 보입니다.
6. 포맷 선택 결정 트리
이미지가 손에 있을 때, 어떤 포맷을 선택해야 할까요? 이 결정 트리가 빠른 답을 제공합니다:
요약하면: 사진은 JPEG 또는 WebP로, 아이콘과 텍스트는 PNG로, 투명도가 필요한 것은 JPEG를 피해야 합니다.
7. FAQ: 세 가지 일반적인 질문
Q1: 왜 Q75가 “최고의” 품질 팩터로 간주되나요?
양자화 곡선이 여기에 변곡점을 가지기 때문입니다. Q75는 약 66.7의 스케일에 해당하며, 양자화 테이블을 기준의 약 2/3로 압축합니다. 이 지점에서 눈이 가장 민감한 저주파 계수는 거의 손상 없이 보존되고, 시각적으로 중요하지 않은 고주파 계수가 합리적으로 버려지기 시작합니다. 더 높은 Q85나 Q95로 가면 품질을 개선하는 것보다 훨씬 빠르게 파일 크기가 부풀어 오르고, 더 낮은 Q60이나 Q50으로 가면 블록 아티팩트와 링잉이 보이게 됩니다. Q75는 크기가 빠르게 떨어지고 품질이 천천히 떨어지는 영역에 정확히 위치하며, 이것이 기본값으로 널리 사용되는 이유입니다. “최고”는 웹 화면 표시에 상대적인 것입니다 — 전문 인쇄나 아카이빙에는 Q90 이상이 필요할 수 있습니다.
Q2: WebP가 JPEG를 완전히 대체할 수 있나요?
압축 효율 면에서 WebP의 손실 모드는 동등한 SSIM에서 JPEG보다 25%–35% 작으며, 투명도와 애니메이션을 지원하므로 기술적으로 우수합니다. 하지만 “완전한 대체”는 여전히 불가능합니다. 세 가지 이유가 있습니다. 첫째, 일부 오래된 브라우저와 이미지 처리 라이브러리가 WebP를 완전히 지원하지 않습니다. 둘째, 초기 구현에서 WebP 인코딩이 JPEG보다 느렸습니다(현대 라이브러리는 이 격차를 크게 좁혔지만). 셋째, JPEG는 30년의 생태계 포화도를 가지고 있습니다 — 카메라 출력, CMS 플랫폼, 이메일 첨부 파일이 모두 완벽하게 지원합니다. 일반적인 엔지니어링 관행은 JPEG와 WebP 버전을 모두 출력하고 <picture> 태그를 통해 브라우저가 선택하게 하는 것입니다.
Q3: 같은 이미지를 JPEG로 반복적으로 재압축하면 어떻게 되나요?
왜곡이 누적되며, 되돌릴 수 없습니다. JPEG 압축마다 양자화와 DCT가 다시 실행됩니다; 이전 패스에서 도입된 블록 아티팩트와 링잉이 “이미지 콘텐츠”로 처리되어 다시 양자화되므로, 아티팩트가 점점 더 눈에 띄게 되고 품질이 계단 모양으로 저하됩니다. 이 현상을 “세대 손실”이라고 합니다. 해결책은 무손실 마스터(PNG/TIFF 또는 Q100의 JPEG)를 보관하고 모든 변형을 그 마스터에서 파생하는 것입니다 — 이미 압축된 JPEG를 재압축하지 마세요. 여러 편집이 불가피한 경우, 작업 버전을 무손실 중간 포맷(PSD, TIFF)으로 저장하고 최종 출력 시에만 JPEG로 압축하세요.
8. 요약 및 매개변수 치트 시트
JPEG 압축의 핵심은 주파수 영역 정보를 파일 크기와 교환하는 것이며, 품질 팩터는 본질적으로 양자화 테이블을 스케일링하는 노브입니다. Q75가 마법의 숫자인 이유는 양자화 곡선의 변곡점에 정확히 위치하기 때문입니다: 더 높이 가면 인지할 수 있는 품질 향상 없이 크기가 부풀어 오르고, 더 낮추면 블록 아티팩트가 보이기 시작합니다. 합리적인 해상도 감소와 결합하여, Q75는 수 메가픽셀 사진을 수백 킬로바이트로 웹에 표시하며 무시할 수 있는 시각적 손실을 허용합니다.
원리를 이해하면 매개변수 선택은 더 이상 추측이 아닙니다. 이 치트 시트는 일상적인 참고용입니다:
| 시나리오 | 권장 포맷 | 품질 팩터 | 해상도 | 예상 크기 |
|---|---|---|---|---|
| 웹 문서 이미지(사진) | JPEG | 75–80 | 긴 변 ≤ 1920px | 200–400 KB |
| 웹 썸네일 | JPEG | 70 | 긴 변 ≤ 400px | 15–40 KB |
| 아이콘 / UI 요소 | PNG | — | 원본 | 다양함 |
| 텍스트 스크린샷 | PNG | — | 원본 | 다양함 |
| 투명 배경 | WebP / PNG | — | 원본 | — |
| 고해상도 사진 아카이브 | JPEG | 90–95 | 원본 | 2–5 MB |
| 인쇄 출력 | TIFF / PNG | — | ≥ 300 DPI | 무제한 |
| 현대 사이트, 최소 크기 | WebP | 75–80 | 긴 변 ≤ 1920px | 150–300 KB |
메인 라인 — 색상 공간 변환 → DCT → 양자화 → 엔트로피 부호화 — 을 마스터하고, 품질 팩터가 양자화 테이블을 어떻게 스케일링하는지 이해한 후, 해상도 감소와 포맷 선택과 결합하면, 이미지 압축은 “감각으로 매개변수 조정하기”에서 증거 기반 엔지니어링 결정으로 바뀝니다.
관련 글:
파일 압축이 필요하신가요? SmartSlim을 사용해 보세요
자체 개발한 Rust 압축 엔진 기반으로 PDF/이미지/비디오/Office/OFD 등 10대 분류 40+ 포맷을 지원합니다. 로컬 압축으로 데이터가 외부로 나가지 않습니다.