- 점진적 JPEG의 다중 스캔 구조를 변형하면 다운로드가 진행될수록 화질이 좋아지는 대신, 이미 표시된 이미지가 다른 이미지로 계속 바뀌게 할 수 있음
- 각 스캔은 색상 채널·DCT 주파수 범위·정밀도를 지정하며, 같은 해상도의 JPEG에서 일부 마커를 제거해 이어 붙이면 기존 렌더링 데이터를 덮어쓸 수 있음
- 디코더는 압축 폭탄과 유사한 문제를 막기 위해 처리할 스캔 수를 제한하며, Chrome은 약 90프레임까지 렌더링하고 Firefox 등은 더 많이 처리함
- 프레임마다 DC 전용 스캔 하나만 사용하면 프레임 수를 늘리면서 잔상을 피할 수 있지만, DCT 블록 특성상 결과 해상도는 원본의 1/16로 낮아짐
- 단일 JPEG에 영상처럼 여러 프레임을 담을 수 있으나 타이밍 정보가 없어 재생 속도가 네트워크 지연에 좌우되며, 실용적 영상보다는 부분 렌더링을 활용한 HTML·단일 페이지 앱 실험에 적합함
점진적 JPEG가 이미지를 표시하는 방식
- JPEG는 저주파 성분을 먼저 저장해 파일을 일부만 다운로드한 상태에서도 잘린 이미지 대신 저해상도 미리보기를 표시할 수 있음
- 압축 데이터는 여러 스캔(scan) 으로 나뉘며 각 스캔 앞에는 헤더가 붙음
FF DA는 스캔 시작 마커임- 이어서 길이 필드, 포함된 채널 수와 ID, Huffman 테이블 인덱스가 들어감
- 시작·종료 DCT 빈과 정밀도를 지정한 뒤 Huffman 부호화된 DCT 계수를 저장함
- 첫 스캔에는 세 색상 채널에서 가장 낮은 DC 주파수 빈이 포함됨
YCbCr와 단계별 품질 개선
- JPEG의 세 색상 채널은 일반적인 RGB 대신 YCbCr를 사용함
Y는 휘도이므로 높은 품질이 필요함Cb,Cr은 색차 성분이어서 품질을 낮춰도 시각적 영향이 크지 않음- 매우 거칠게 나타내면
Y = G,Cb = B - G,Cr = R - G임
- 예제 JPEG는 스캔 0부터 9까지 데이터를 단계적으로 채움
- 스캔 0:
Y Cb Cr, DCT 빈0–0을 절반 정밀도로 저장해 매우 낮은 해상도의 미리보기를 제공함 - 스캔 1:
Y, 빈1–5를 1/4 정밀도로 추가해 휘도 세부 정보를 보강함 - 스캔 2·3:
Cb,Cr의 빈1–63을 절반 정밀도로 추가함 - 스캔 4:
Y의 빈6–63을 1/4 정밀도로 채워 스캔 1이 남긴 범위를 보완함 - 스캔 5:
Y의 빈1–63을 절반 정밀도로 개선함 - 스캔 6–9: 각 채널에 마지막 비트를 추가해 완전한 품질로 만듦
- 스캔 0:
- 색차 데이터가 휘도보다 먼저 완성되지만, 색차는 절반 해상도, 즉 1/4 픽셀 수로 저장되므로
Cr + Cb전체 용량도 휘도의 절반에 불과함
다운로드 중 이미지 바꾸기
- 각 스캔이 적용할 주파수 범위를 명시하므로 이후 스캔으로 이미 렌더링된 이미지 데이터를 덮어쓰는 JPEG를 만들 수 있음
- 같은 해상도의 이미지 여러 장을 이어 붙이되 다음 마커를 걸러내는 방식으로 구현함
- 이미지 시작(start-of-image)
- 프레임 시작(start-of-frame)
- 이미지 종료(end-of-image)
- 16진수 편집기로도 만들 수 있지만 실제 생성에는 간단한 C 프로그램을 사용함
- 파일을 느린 네트워크로 전송하면 다운로드가 진행되는 동안 여러 이미지가 차례로 전환됨
디코더의 스캔 제한
- 대부분의 JPEG 디코더는 일정 개수의 스캔을 처리하면 중단함
- 압축 폭탄과 유사한 문제를 피하기 위한 제한으로 추정되며, 단순 결합 방식으로는 9프레임 이상 구현하기 어려움
- 더 긴 애니메이션을 만들려면 프레임마다 필요한 스캔 수를 최소화해야 함
Baseline JPEG를 사용할 수 없는 이유
- 스캔 하나만 사용하는 Baseline JPEG에서 시작하는 방식은 작동하지 않음
- 점진적 모드에서는 한 스캔에 DC 데이터인 빈 0과 AC 데이터인 빈 1 이상을 함께 넣을 수 없음
- Baseline 모드에는 이 제한이 없지만, Baseline 디코더가 첫 스캔 뒤 처리를 중단함
- AC 데이터는 DC 데이터 뒤에 와야 하므로 가장 작은 점진적 JPEG 프레임은 DC 전용 스캔 하나로 구성됨
DC 전용 프레임의 구성과 해상도
- DCT가 16×16 블록 단위로 처리되므로 DC 데이터만 포함해도 단색이 아니라 원본의 1/16 해상도 이미지를 만들 수 있음
- 최소 프레임은
Y Cb Cr세 채널의 DCT 빈0–0을 완전한 정밀도로 저장하는 스캔 하나만 사용함 - 이 구성에서는 Chrome이 처리를 중단하기 전까지 약 90프레임을 렌더링함
- Firefox 같은 다른 브라우저는 더 많은 스캔을 처리함
- 90개 스캔으로 구성된 이미지는 거의 모든 브라우저에서 작동함
잔상 없는 프레임 전환
- 단순 결합 방식의 잔상은 AC 스캔이 기존 데이터를 정밀화하도록 설계된 데서 발생함
- 일반적인 점진적 JPEG에서는 파일 크기를 크게 늘리지 않고 여러 정밀도 단계를 담을 수 있지만, 이미지를 교체하는 방식에는 맞지 않음
- 실제 점진적 개선 없이 DC 전용 스캔만 사용하면 이전 AC 데이터의 정밀화가 일어나지 않아 잔상을 피할 수 있음
- DC 전용 프레임은 표준을 준수하는 JPEG 이미지여서 특수한 인코더가 필요하지 않음
- 스캔 명세에는
0,1,2:0-0,0,0;처럼 세 채널의 DC 빈만 지정함
- 스캔 명세에는
단일 JPEG 영상의 한계
- DC 전용 프레임을 이어 붙이면 JPEG 파일 하나에 전체 영상을 담을 수 있음
- JPEG 스캔에는 프레임 타이밍을 추가할 방법이 없어 재생 속도가 전적으로 네트워크 지연에 좌우됨
- 비전통적인 Rickroll이나 장난 외에는 실용적인 응용 분야가 없음
부분 렌더링을 확장한 실험
- 부분 렌더링을 활용하면 JPEG 프레임 교체 외의 실험도 가능함
<dialog>태그만 사용한 순수 HTML 영상으로 Bad Apple 영상을 구현함- 데이터를 파일에 하드코딩할 필요 없이 CSS나 JavaScript가 없는 대화형 단일 페이지 애플리케이션도 구현함
- 이미지 생성에는
merge.cC 코드를 사용함