600×400 사진은 날것의 색으로 72만 바이트지만, JPEG로는 3만 바이트 안팎이 됩니다. 이 페이지에는 브라우저용으로 짠 JPEG 인코더가 통째로 들어 있어, 진짜 .jpg 파일을 만들면서 색 나누기, 8×8 블록과 DCT, 양자화, 엔트로피 부호화를 한 단계씩 직접 만져 봅니다.
눈은 밝기에는 예민하고 색에는 둔합니다. 그래서 JPEG는 먼저 픽셀의 빨강·초록·파랑을 밝기 하나(Y)와 색 차이 둘(Cb는 파랑 쪽, Cr은 빨강 쪽)로 다시 씁니다. 4:2:0에서는 색을 가로 절반, 세로 절반 크기로만 남깁니다. 본격적인 압축 전에 이것만으로 데이터가 절반이 됩니다.
이 페이지가 방금 만든 .jpg를 브라우저 자체 디코더로 연 것입니다. 누르거나 끌어서 확대할 곳을 고릅니다.
곡선: 지금 그림을 이 페이지 인코더로 품질 5부터 95까지 압축한 파일 크기(파랑)와 PSNR(분홍). 점이 지금 설정입니다.
채널 그림의 한 점을 누르면 그 픽셀을 두 색 체계로 읽습니다.
왼쪽은 밝기(Y)만, 오른쪽은 색(Cb·Cr)만 해상도를 줄였다가 다시 늘렸습니다. 숫자로는 둘 다 잃지만, 눈에 띄는 쪽은 한쪽입니다.
각 채널을 8×8 블록으로 자릅니다. 블록마다 정해진 물결 무늬 64개를 섞은 것으로 다시 씁니다(이산 코사인 변환, DCT). 왼쪽 위 무늬는 평평한, 곧 블록의 평균입니다. 오른쪽·아래로 갈수록 빠르게 출렁입니다. 사진은 대부분 매끄러워서 블록의 힘이 왼쪽 위 숫자 몇 개에 몰립니다. 아직 잃은 것은 없습니다. DCT는 정확히 되돌릴 수 있습니다.
무늬를 누르면 크게 봅니다. 밝으면 양수, 어두우면 음수.
칸을 누르거나 끌어서 칠합니다.
물결 세기마다 양자화 표의 숫자로 나누고 반올림합니다. 잔무늬 물결은 큰 수로 나누므로 대부분 0이 됩니다. 품질 설정은 표 전체를 키우거나 줄입니다. 정보를 잃는 단계는 여기 하나뿐이고, JPEG 깨짐이 네모와 물결 모양인 이유도 이것입니다.
표준 표는 사람 눈에 맞춰져 있습니다. 잔무늬는 거칠게, 완만한 명암은 부드럽게 나눕니다. 아래는 모든 칸이 같은 고른 표를, 지금 품질의 표준 표와 파일 크기가 비슷해지도록 맞춘 것입니다. 바이트, PSNR, 눈으로 보이는 것을 비교해 보세요.
반올림 뒤 블록은 숫자 몇 개 뒤에 긴 0 줄이 붙은 모양입니다. JPEG는 지그재그 순서로 읽으며 0 아닌 숫자를 그 앞의 0 개수와 함께 적고, 끝의 0들은 끝 표시(EOB) 하나로 대신합니다. 자주 나오는 기호에는 짧은 허프만 부호, 드문 기호에는 긴 부호를 줍니다(JPEG 표준 표). 블록 평균(DC)은 앞 블록과의 차이로 적습니다. 이 단계는 잃는 것이 없습니다.
섀넌 엔트로피는 이 기호 빈도에서 어떤 부호라도 평균적으로 쓸 수 있는 가장 적은 비트 수입니다. 표준 허프만 표는 흔한 사진에 맞춰 한 번 만들어 둔 것이라 조금 위에 있습니다.
JPEG는 매끄러운 사진을 가정합니다. 또렷한 글자, 선, 단색 면에는 잔무늬가 많은데, 그것이 바로 양자화가 버리는 부분이라 가장자리에 물결이 생깁니다. JPEG를 다시 JPEG로 저장하면 조금씩 더 잃습니다. 무손실 PNG는 단색 면을 아주 잘 다룹니다. 새 형식(WebP, AVIF)과 신경망 코덱도 변환, 양자화, 엔트로피 부호화라는 같은 설계를 더 똑똑한 부품으로 씁니다.
선 하나가 그림 하나, 품질 10~95(4:2:0). 왼쪽 위일수록 좋습니다. 세로 점선은 같은 그림을 무손실 PNG로 저장한 크기입니다(축 안에 들 때만).
교육용 페이지입니다. 직접 연 사진은 이 브라우저 안에서만 처리하고 올리거나 저장하지 않습니다.