JPEG 파일 구조

JPEG (Joint Photographic Experts Group)는 손실 압축 방식을 사용하는 대표적인 이미지 파일 형식입니다. JPEG 파일은 이미지 데이터를 효율적으로 저장하기 위해 복잡한 구조를 가지고 있으며, 여러 개의 마커(Marker)를 사용하여 이미지 정보를 구성합니다.

1. JPEG 파일의 기본 구조:

JPEG 파일은 다음과 같은 기본적인 구조를 가집니다.

[SOI (Start of Image) 마커] [APPn 마커 (선택 사항)] [SOFn (Start of Frame) 마커] [DHT (Define Huffman Table) 마커] [DQT (Define Quantization Table) 마커] [SOS (Start of Scan) 마커] [압축된 이미지 데이터] [EOI (End of Image) 마커]
  • SOI (Start of Image) 마커: JPEG 파일의 시작을 알리는 마커입니다. ( FF D8 )
  • APPn (Application) 마커: 애플리케이션 관련 정보를 저장하는 마커입니다. Exif 데이터, ICC 프로파일 등이 APPn 마커에 저장될 수 있습니다. ( FF E0 ~ FF EF )
  • SOFn (Start of Frame) 마커: 이미지의 기본적인 속성 (폭, 높이, 색상 구성 요소 등)을 정의하는 마커입니다. ( FF C0 ~ FF C3, FF C5 ~ FF C7, FF C9 ~ FF CB, FF CD ~ FF CF )
  • DHT (Define Huffman Table) 마커: 허프만 코딩 테이블을 정의하는 마커입니다. 압축된 이미지 데이터를 디코딩하는 데 사용됩니다. ( FF C4 )
  • DQT (Define Quantization Table) 마커: 양자화 테이블을 정의하는 마커입니다. 압축 과정에서 데이터 손실을 제어하는 데 사용됩니다. ( FF DB )
  • SOS (Start of Scan) 마커: 압축된 이미지 데이터의 시작을 알리는 마커입니다. ( FF DA )
  • 압축된 이미지 데이터: DCT (Discrete Cosine Transform), 양자화, 허프만 코딩 등의 과정을 거쳐 압축된 이미지 데이터입니다.
  • EOI (End of Image) 마커: JPEG 파일의 끝을 알리는 마커입니다. ( FF D9 )

2. 핵심 데이터 구조체 상세 설명:

JPEG 파일에서 가장 중요한 데이터 구조체는 다음과 같습니다.

  • SOI (Start of Image) 마커:
    • 마커 코드: FF D8 (2 바이트)
    • JPEG 파일의 시작을 알립니다.
  • APPn (Application) 마커:
    • 마커 코드: FF E0 ~ FF EF (2 바이트)
    • Length: APPn 마커 데이터의 길이 (2 바이트)
    • Data: 애플리케이션 관련 데이터 (가변 길이)
      • Exif 데이터: 카메라 모델, 촬영 정보 등
      • ICC 프로파일: 색상 프로파일 정보
  • SOFn (Start of Frame) 마커:
    • 마커 코드: FF C0 (Baseline DCT), FF C1 (Extended Sequential DCT), FF C2 (Progressive DCT), FF C3 (Lossless) 등 (2 바이트)
    • Length: SOFn 마커 데이터의 길이 (2 바이트)
    • Precision: 색상 성분의 정확도 (일반적으로 8 비트) (1 바이트)
    • Image Height: 이미지 높이 (2 바이트)
    • Image Width: 이미지 폭 (2 바이트)
    • Number of Components: 색상 성분의 수 (1 바이트)
    • Component Information: 각 색상 성분에 대한 정보 (각 성분당 3 바이트)
      • Component ID (1 바이트)
      • Sampling Factors (1 바이트)
      • Quantization Table Number (1 바이트)
  • DHT (Define Huffman Table) 마커:
    • 마커 코드: FF C4 (2 바이트)
    • Length: DHT 마커 데이터의 길이 (2 바이트)
    • Huffman Table Information: 허프만 테이블 정보 (가변 길이)
      • Table Class and Destination ID (1 바이트)
      • Number of Codes of Length i (각 i=1~16 바이트)
      • Values (허프만 코드 값)
  • DQT (Define Quantization Table) 마커:
    • 마커 코드: FF DB (2 바이트)
    • Length: DQT 마커 데이터의 길이 (2 바이트)
    • Quantization Table Information: 양자화 테이블 정보 (가변 길이)
      • Table ID (1 바이트)
      • Quantization Table Values (64 바이트)
  • SOS (Start of Scan) 마커:
    • 마커 코드: FF DA (2 바이트)
    • Length: SOS 마커 데이터의 길이 (2 바이트)
    • Number of Components: 색상 성분의 수 (1 바이트)
    • Component Information: 각 색상 성분에 대한 정보 (각 성분당 2 바이트)
      • Component ID (1 바이트)
      • Huffman Table Selection (1 바이트)
    • Start of Spectral Selection: 스펙트럼 선택 시작 (1 바이트)
    • End of Spectral Selection: 스펙트럼 선택 종료 (1 바이트)
    • Successive Approximation Bit High: 연속 근사 비트 높음 (4 비트)
    • Successive Approximation Bit Low: 연속 근사 비트 낮음 (4 비트)
  • 압축된 이미지 데이터:
    • 허프만 코딩된 DCT 계수 데이터
  • EOI (End of Image) 마커:
    • 마커 코드: FF D9 (2 바이트)
    • JPEG 파일의 끝을 알립니다.

3. SOFn 마커 (Start of Frame) 예시:

SOFn 마커는 이미지의 기본적인 속성을 정의하는 중요한 마커입니다. 예를 들어, FF C0 마커 (Baseline DCT)의 구조는 다음과 같습니다.

FF C0 [Length] [Precision] [Image Height] [Image Width] [Number of Components] [Component 1 Info] [Component 2 Info] [Component 3 Info] ...

각 필드의 의미는 다음과 같습니다.

  • FF C0: 마커 코드 (2 바이트)
  • Length: SOFn 마커 데이터의 길이 (2 바이트). 5 + (Number of Components * 3) 바이트
  • Precision: 색상 성분의 정확도 (1 바이트). 일반적으로 8 (8 비트)
  • Image Height: 이미지 높이 (2 바이트).
  • Image Width: 이미지 폭 (2 바이트).
  • Number of Components: 색상 성분의 수 (1 바이트). 예: 1 (Grayscale), 3 (YCrCb 또는 RGB)
  • Component Information: 각 색상 성분에 대한 정보 (각 성분당 3 바이트).
    • Component ID (1 바이트): 색상 성분 ID (예: Y, Cr, Cb)
    • Sampling Factors (1 바이트): 수평 및 수직 샘플링 비율 (상위 4비트: 수평, 하위 4비트: 수직)
    • Quantization Table Number (1 바이트): 사용할 양자화 테이블 ID

4. JPEG 파일 분석:

JPEG 파일을 분석하려면 다음과 같은 단계를 따를 수 있습니다.

  1. 파일을 열고 SOI 마커 (FF D8)를 찾습니다.
  2. 마커를 순차적으로 읽으면서 각 마커의 종류와 데이터를 파싱합니다.
  3. SOFn 마커를 찾아 이미지 폭, 높이, 색상 성분 정보 등을 추출합니다.
  4. DHT, DQT 마커를 찾아 허프만 테이블과 양자화 테이블 정보를 추출합니다.
  5. SOS 마커를 찾아 압축된 이미지 데이터의 시작 위치를 확인합니다.
  6. 압축된 이미지 데이터를 허프만 테이블과 양자화 테이블을 사용하여 디코딩합니다.
  7. EOI 마커 (FF D9)를 찾아 파일의 끝을 확인합니다.

주의 사항:

  • JPEG 파일 구조는 매우 복잡하며, 모든 JPEG 파일이 동일한 구조를 가지는 것은 아닙니다.
  • 일부 JPEG 파일은 Exif 데이터, ICC 프로파일 등의 메타 정보를 포함할 수 있습니다.
  • JPEG 파일을 정확하게 분석하려면 JPEG 스펙 문서를 참조해야 합니다.
  • JPEG 파일 분석을 위해 다양한 라이브러리 (예: libjpeg)를 사용할 수 있습니다.