JPEG 종류와 마커

모든 JPEG 종류에서 마커의 순서나 구성이 완전히 동일하지는 않습니다. 제시해주신 목록은 JPEG 파일의 일반적인 구성 요소를 보여주는 좋은 예시이지만, 몇 가지 중요한 차이점과 가변성이 있습니다.

핵심 요점:

  1. 필수 마커:
    • SOI (Start of Image - FF D8): 모든 JPEG 파일의 시작을 알리는 마커입니다. 이것은 항상 맨 처음에 옵니다.
    • EOI (End of Image - FF D9): 모든 JPEG 파일의 끝을 알리는 마커입니다. 이것은 항상 맨 마지막에 옵니다.
  2. 가변적인 마커 및 순서:
    • APPn (Application Marker Segments - FF E0 ~ FF EF):
      • 선택 사항입니다. 파일에 없을 수도 있고, 하나 이상 있을 수도 있습니다.
      • 종류가 다릅니다: JFIF 정보는 APP0 (FF E0)에, Exif 정보는 APP1 (FF E1)에 저장되는 식입니다. 따라서 어떤 APPn 마커가 존재할지는 파일마다 다릅니다. Adobe 정보는 APP14에 있을 수 있습니다.
      • 순서: 일반적으로 SOI 바로 뒤에 오지만, 여러 개의 APPn 마커가 있다면 그들 사이의 순서는 정해져 있지 않을 수 있습니다 (예: APP0 다음에 APP1이 올 수도 있고, APP1 다음에 APP0이 올 수도 있습니다).
    • SOFn (Start of Frame - FF C0 ~ FF CF, 일부 제외):
      • 필수적인 요소이지만, 어떤 SOFn 마커가 사용되는지가 JPEG 종류를 결정합니다.
        • SOF0 (FF C0): Baseline DCT (가장 일반적)
        • SOF1 (FF C1): Extended sequential DCT
        • SOF2 (FF C2): Progressive DCT
        • SOF3 (FF C3): Lossless (Sequential)
        • ... 등등
      • 따라서 파일의 종류에 따라 SOF0, SOF1, SOF2  다른 마커가 사용됩니다.
      • 일반적으로 DQT, DHT 정의 후에 나오지만, 파일 구조에 따라 약간의 변형은 있을 수 있습니다. Hierarchical JPEG 같은 경우는 여러 개의 SOFn 마커가 있을 수도 있습니다.
    • DHT (Define Huffman Table - FF C4):
      • 압축 해제에 필요한 허프만 테이블을 정의합니다.
      • 대부분의 파일에 포함되지만, 이론적으로는 표준 테이블을 사용하는 경우 생략될 수도 있습니다 (매우 드뭄).
      • 보통 SOFn 마커 전이나 후, 그리고 SOS 마커 전에 위치합니다.
      • Progressive JPEG에서는 스캔(Scan)마다 다른 테이블을 사용할 수 있어 여러 번 정의될 수도 있습니다.
    • DQT (Define Quantization Table - FF DB):
      • 양자화 테이블을 정의합니다.
      • 거의 항상 포함됩니다.
      • 보통 DHT 마커와 비슷하게 SOFn 전이나 후, 그리고 SOS 마커 전에 위치합니다. 여러 번 정의될 수도 있습니다.
    • SOS (Start of Scan - FF DA):
      • 실제 압축된 이미지 데이터 스트림의 시작을 알립니다.
      • Baseline JPEG에서는 보통 한 번 나옵니다.
      • Progressive JPEG에서는 이미지를 여러 번 스캔(예: 저해상도부터 점진적으로 선명하게)하기 때문에 여러 번의 SOS 마커와 해당 데이터 청크가 번갈아 나타납니다.
      • 따라서 SOS 마커의 개수와 위치는 JPEG 종류에 따라 크게 다릅니다.
    • 압축된 이미지 데이터: SOS 마커 뒤에 오며, 다음 마커(다른 SOS 또는 EOI) 앞에서 끝납니다. 데이터 자체의 구조(Interleaving 방식 등)도 SOFn과 SOS에서 정의된 파라미터에 따라 달라집니다.
    • 기타 마커: DRI (FF DD - Restart Interval 정의), COM (FF FE - 주석) 등 다른 선택적 마커들이 중간에 포함될 수 있습니다.

결론:

제시된 목록 [SOI] [APPn] [SOFn] [DHT] [DQT] [SOS] [데이터] [EOI] 가장 일반적인 Baseline JPEG의 단순화된 구조를 나타낸다고 볼 수 있습니다. 하지만 실제로는 다음과 같은 이유로 모든 JPEG에서 동일하지 않습니다.

  • APPn: 존재 여부, 종류, 개수, 순서가 다름.
  • SOFn: 사용되는 특정 마커(SOF0, SOF1, SOF2 등)가 다름 (이것이 JPEG 타입을 정의함).
  • DHT/DQT: 개수와 위치가 다를 수 있음 (특히 Progressive).
  • SOS/데이터: 개수와 위치가 크게 다를 수 있음 (Baseline vs. Progressive).
  • 기타 마커: 중간에 삽입될 수 있음.

따라서 JPEG 파일을 파싱하거나 분석할 때는 SOI와 EOI를 제외한 나머지 마커들의 존재 여부, 순서, 개수, 특정 타입이 가변적이라는 점을 반드시 인지해야 합니다. 마커 자체(FF xx)를 순차적으로 읽고 그 종류에 따라 처리하는 방식이 일반적입니다.

 

 

제시된 목록 [SOI] [APPn] [SOFn] [DHT] [DQT] [SOS] [데이터] [EOI] 가장 기본적인 Baseline JPEG의 일반적인 구조를 보여주는 좋은 예시이지만, 실제 JPEG 파일의 구조는 훨씬 다양하며 다른 마커나 다른 순서를 가질 수 있습니다.

다음은 제시된 목록 외에 고려해야 할 주요 변형 및 추가 마커입니다.

1. 마커 순서의 유연성:

  • DHT (Define Huffman Table)와 DQT (Define Quantization Table) 마커는 SOFn (Start of Frame) 마커 앞이나 뒤에 올 수 있습니다. 중요한 것은 SOS (Start of Scan) 마커가 참조하는 테이블이 SOS 마커 전에 정의되어야 한다는 점입니다.
  • 여러 개의 APPn 마커가 있다면 그 순서는 다양할 수 있습니다. (예: APP0 다음에 APP1, 또는 APP1 다음에 APP0)

2. 마커의 반복 (여러 번 나타나는 경우):

  • APPn (Application Marker Segments): 파일에 따라 여러 개의 APPn 마커가 존재할 수 있습니다. 예를 들어, JFIF 정보(APP0)와 Exif 정보(APP1)가 모두 포함된 파일이 일반적입니다. Adobe 관련 정보(APP14) 등이 추가될 수도 있습니다.
  • DHT / DQT: 특히 복잡한 파일이나 최적화된 파일에서는 여러 개의 허프만 테이블이나 양자화 테이블이 정의될 수 있습니다. 예를 들어, 컬러 컴포넌트(Y, Cb, Cr)마다 다른 테이블을 사용할 경우 여러 번 정의될 수 있습니다.
  • SOS (Start of Scan) / 데이터:
    • Progressive JPEG의 핵심 특징입니다. 이미지를 한 번에 전송하는 대신 여러 번의 스캔(Scan)으로 나누어 점진적으로 표시합니다. 따라서 Progressive JPEG 파일에는 여러 개의 SOS 마커와 그에 따른 이미지 데이터 청크가 번갈아 나타납니다.
    • 예시 (Progressive JPEG): [SOI] ... [SOF2] ... [DHT] ... [SOS] [스캔1 데이터] ... [DHT] ... [SOS] [스캔2 데이터] ... [EOI]
    • Hierarchical JPEG 같은 형식도 여러 프레임/스캔을 가질 수 있습니다.

3. 목록에 없는 다른 주요 마커:

  • DRI (Define Restart Interval - FF DD):
    • 오류 발생 시 데이터 손실을 최소화하기 위해 압축 데이터 중간에 삽입되는 RSTm 마커 간의 간격(데이터 양)을 정의합니다.
    • 주로 SOS 마커 전에 위치합니다.
  • RSTm (Restart Markers - FF D0 ~ FF D7):
    • DRI 마커가 정의된 경우, 압축된 이미지 데이터 스트림 내부에 주기적으로 삽입됩니다. 에러 발생 시 이 마커 지점부터 디코딩을 재개할 수 있게 도와줍니다. 제시된 목록은 데이터 스트림 내부의 마커는 표현하지 못합니다.
  • COM (Comment - FF FE):
    • 파일에 대한 텍스트 주석(예: 생성 프로그램 정보)을 포함합니다.
    • SOI와 EOI 사이, 그리고 압축 데이터 스트림 외부의 거의 어디에나 위치할 수 있으며, 여러 개 존재할 수도 있습니다.
  • DAC (Define Arithmetic Coding Conditioning - FF CC):
    • 허프만 코딩 대신 산술 코딩(Arithmetic Coding)을 사용할 경우 필요한 테이블을 정의합니다. 허프만 코딩보다 압축률이 약간 더 좋지만 덜 일반적입니다.
  • 기타 SOFn 마커: SOF3(무손실), SOF5, SOF6, SOF7 등 다른 압축 방식을 나타내는 SOF 마커들이 있습니다.

결론:

제시된 [SOI] [APPn] [SOFn] [DHT] [DQT] [SOS] [데이터] [EOI] 구조는 JPEG의 기본 뼈대를 이해하는 데 도움이 되지만, 실제로는 다음과 같은 이유로 다양한 변형이 존재합니다.

  • 마커 순서가 일부 유연함 (특히 DHT, DQT, SOFn).
  • 마커가 여러 번 나타날 수 있음 (APPn, DHT, DQT, 그리고 Progressive의 경우 SOS).
  • 목록에 없는 다른 중요한 마커(DRI, RSTm, COM, DAC 등)가 포함될 수 있음.
  • 압축 데이터 스트림 내부에도 마커(RSTm)가 있을 수 있음.

따라서 JPEG 파일을 정확히 처리하려면 단순히 고정된 순서를 가정하는 것이 아니라, FF xx 형태의 마커를 순차적으로 읽고 각 마커가 나타내는 세그먼트의 종류와 길이를 파악하여 그에 맞게 데이터를 해석해야 합니다.