본문 바로가기

디지털 사진 한 장에 대한 궁금증

4. JPEG 파일 속 들여다 보기



 




이제<그림 1>의 디지털 사진(P1010194.jpg)의 바이트 정보를 파악하여 실제로 어떤 포맷으로 파일이 구성되어 있고, 압축된 정보가 어떻게 저장되어 있는 지 살펴보고자 한다. 사진 데이터의 분석은 울트라에이트(Ultraedit) 소프트웨어를 이용하여 JPEG 파일의 핵사 값들을 읽고, 표준 JPEG 표준 포맷 정의와 비교하면서 진행한다.  

 

Ultraedit 편집기로 JPEG파일을 열면 파일은 0xFFD8로 시작하는 데, 이는 SOI(Start Of Image)를 의미하는 ‘Marker’이다. MarkerJPEG파일에서 구조를 구분하는 2byte의 값으로 첫 번째 바이트는 0xFF이고 두 번째 바이트는0xC0 ~ 0XFE의 값을 가진다. 0xFF 데이터가 연속으로 있을 때는 더미 데이타를 표현하는 것이고, 마지막 0xFF만을 마커로 인식한다. < 6>은 주요 마커와 그 값을 정리하였다[1]. 마커 중에서 데이터(payload)가 없는 종류는 단독으로 사용한다. 반면에, 데이터가 있는 마커는 반드시 마커 뒤에 2byte의 데이터 길이 필드가 있다.



Short name

Bytes

Payload

Name

SOI

0xFF, 0xD8

none

Start Of Image

SOF0

0xFF, 0xC0

variable size

Start Of Frame (baseline DCT)

SOF2

0xFF, 0xC2

variable size

Start Of Frame (progressive DCT)

DHT

0xFF, 0xC4

variable size

Define Huffman Table(s)

DQT

0xFF, 0xDB

variable size

Define Quantization Table(s)

DRI

0xFF, 0xDD

4 bytes

Define Restart Interval

SOS

0xFF, 0xDA

variable size

Start Of Scan

RSTn

0xFF, 0xDn (n=0..7)

none

Restart

APPn

0xFF, 0xEn

variable size

APP0 : Exif, APP1 TIFF

COM

0xFF, 0xFE

variable size

Comment

EOI

0xFF, 0xD9

none

End Of Image

              

                  <6> JPEG 파일의 마커(marker)의 종류

 


JPEG 파일의 전체 구조는 <그림 20>과 같다. APP0<그림 2>에서 보았던 Thumbnail 이미지에 대한 정보이고, <그림 19>의 절차를 따라 인코딩된 데이터는 ESC0 영역에 저장된다.






SOIAPPn


이제부터 바이트 하나하나를 읽고 확인한다.





Offset

Marker

Fields

데이타

의미

0x00

SOI

 

FF D8

SOI (Start Of Image)

0x02

APP0

JPEG/JFIF

FF E0

0= JFIF, Thumnail 이미지의 파일 포맷을 정의함.

 

 

 

00 10

JFIF 포맷 데이터의 크기(16bytes : 0x04 ~ 0x13)

 

 

 

4A 46 49 46 00

JFIF\0

 

 

 

01 01

JFIF version

 

 

 

00

Density Units: 0

 

 

 

00 01

Xdensity : 1 (must not be zero)

 

 

 

00 01

Ydensity : 1 (must not be zero)

 

 

 

00

Thumbnail Y축 픽셀 수: 0

 

 

 

00

Thumbnail Y축 픽셀 수: 0

0x14

APP1

JPEG/Exif[2]

FF E1

1= Exif

0x16

 

Data length

17 62

Exif 포맷 데이터의 크기, 0x0116 ~ 0x1777까지 Exif 포맷 데이터임.

 

 

 

45 78 69 66 00 00

Exif\0\0,  Null 2바이트로 표현

0x1E

 

TIFF파일 헤더

49 49

Byte Order (II =little endian) à Exif포맷 파일 내에서는 Little Endian으로 바이트 순서 표시함.

 

 

 

2A 00

42 (=0x002A)

 

 

 

08 00 00 00

0th IFD Offset (=0x00000008)

<7> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기1



<7>에서 APP0을 이용하여 Thumbnail 이미지를 JFIF 파일 형식으로 표현하기 위한 구체 내용이 포함되어 있지 않다. 대신, APP1에서 Exif 파일 형식으로 Thumbnail 이미지를 표현하고 있다. 마커 APP1<그림 22>에의 구조와 같은 헤더와 데이터를 구성한다.








Offset

Marker

Fields

데이타

의미

0x26

 

0th IFD

0C 00

Number of Interoperability (=0x000C, 12)

0x28

 

Tag

Type

Count

Value offset

 

0E 01

02 00

20 00 00 00

9E 00 00 00

 

0x010E à Image Description

0x02 à ASCII 문자

0x00000020 à 32 ASCII문자로 구성

0x0000009E) à 0x9E+0x1E=0xBC번째 바이트부터 이미지 정보 있음; OLYPUS DIGITAL CAMERA.

 

 

Tag

Type

Count

Value offset

 

0F 01

02 00

14 00 00 00

BE 00 00 00

 

0x010F à Make

0x02 à ASCII 문자

0x00000014 à 20 ASCII문자로 구성

0x000000BE à 0xBE+0x1E=0xDC번째 바이트부터 20개 문자로 된 업체 정보 있음; OLYMPUS CORPORATION’.

0x40

 

Tag

Type

Count

Value offset

 

10 01

02 00

11 00 00 00

D2 00 00 00

 

0x0110 à Model

0x02 à ASCII 문자

0x00000011 à 17 ASCII 문자로 구성

0x000000D2 à 0xD2 + 0x 1E = 0xF0번째 바이트부터 17개 문자로 된 모델명 정보 있음; X250,D560Z,C350Z.

 

 

Tag

Type

Count

Value

 

 

 

12 01

03 00

01 00 00 00

01 00 00 00

 

 

 

0x0112 à Orientation

0x0300 à SHORT (2bytes)

0x00000001 à 1SHORT ( 2바이트)

0x00000001 à offset 4바이트보다 작으면 offset 영역에 값(=1)이 저장됨.

1 = The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side.

0x58

 

Tag

 

Type

Count

Value offset

 

 

1A 01

 

05 00

01 00 00 00

E3 00 00 00

 

 

0x011A à XResolution(the number of pixels per ResolutionUnit)

0x0005 à Rational (2 LONGs)

0x00000001 à 1Rational ( 8바이트)

0x000000E3 à 0xE3 + 0x1E = 0x0101번쨰 바이트부터 1개의 8바이트 Rational 변수정보 있음. 0x48÷0x01 = 72dpi (dot per inche)

 

 

Tag

 

Type

Count

Value offset

 

 

1B 01

 

05 00

01 00 00 00

EB 00 00 00

 

 

0x011B à YResolution (the number of pixels per ResolutionUnit)

0x0005 à Rational (2 LONGs)

0x00000001 à 1Rational ( 8바이트)

0x000000EB à 0xEB + 0x1E = 0x0101번쨰 바이트부터 1개의 8바이트 Rational 변수정보(0x00000048, 0x00000001) 있음. 0x48÷0x01 = 72dpi (dot per inche)

0x70

 

Tag

Type

Count

Value

 

28 01

03 00

01 00 00 00

02 00 00 00

 

0x0128 à ResolutionUnt

0x0003 à SHORT(2바이트)

0x00000001 à 1SHORT ( 2바이트)

0x00000002 à offset 4바이트보다 작으면 offset 영역에 값이 저장됨, 2 = inches

 

 

Tag

Type

Count

Value offset

 

31 01

02 00

08 00 00 00

F3 00 00 00

 

0x0131 à Software used

0x0002 à ASCII

0x00000008 à 8ASCII 문자 ( 8바이트)

0x000000F3 à 0xF3 + 0x1E = 0x0111번째 바이트부터 8개 바이트로 구성된 정보. “v774-75”

0x88

 

Tag

Type

Count

Value offset

 

32 01

02 00

14 00 00 00

FB 00 00 00

 

0x0132 à Date time

0x0002 à ASCII

0x00000014 à 20ASCII 문자 ( 20바이트)

0x000000FB à 0xFB + 0x1E = 0x0119번째 바이트부처 20개 바이트로 구성된 정보. “0000:00:00 00:00:00”

 

 

Tag

Type

Count

Value

 

13 02

03 00

01 00 00 00

02 00 00 00

 

0x0213 à YCbCrPositioning

0x0002 à SHORT

0x00000001 à 1 SHORT 변수 ( 2바이트)

0x00000002 à offset 4바이트보다 작으면 offset 영역에 값이 저장됨.  2 = co-sited

0xA0

 

Tag

Type

Count

Value offset

 

69 87

04 00

01 00 00 00

14 02 00 00

 

0x8769 à Exif IFD Pointer

0x0004 à LONG

0x00000001 à 1LONG 변수 ( 4바이트)

0x00000214 à 0x0214+0x1E= 0x232번째 바이트부터 Exif IFD가 시작됨.  Offset 영역에 값이 저장됨.

 

 

Tag

Type

Count

Value

 

A5 C4

07 00

04 01 00 00

0F 01 00 00

 

0xC4A5 à ????

0x0007 à UNDEFINED (1바이트)

0x00000104 à 260개 바이트

0x0000010F à 0x010F + 0x1E = 0x12D번째 바이트부터 260개 바이트의 정보 (0x231번째 바이트까지)

0xB8

 

Next IFD Offset

0E 08 00 00

1th IFD Offset (=0x0000080E) à 0x080E + 0x001E = 0x082C번쨰 바이트부터 1st IFD가 시작됨.

<8> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기2

(Exif파일의 0th IFD)

  







  

Offset

Marker

Fields

데이타

의미

0x0232

 

Exif IFD

22 00

Exif IFD Number (=0x22, 34)

0x0234

 

Tag

Type

Count

Value offset

 

 

9A 82

05 00

01 00 00 00

B2 03 00 00

 

 

0x829A à ExposureTime

0x0005 à Rational, 2 SLONGs

0x00000001 à 2 SLONGS ( 8바이트)

0x0000003B2 à 0x03B2 + 0x1E = 0x3D0번째 바이트부터 8바이트의 정보임. 0x0000000A ÷ 0x00000258 = 10/600

 

 

Tag

Type

Count

Value offset

 

 

9D 82

05 00

01 00 00 00

BA 03 00 00

 

 

0x829D à FNumber

0x0005 à Rational, 2 SLONGs

0x00000001 à 2 SLONGS ( 8바이트)

0x0000003B3 à 0x03BA + 0x1E = 0x3D8번째 바이트부터 8바이트의 정보임. 0x00000027 ÷ 0x0000000A = 3.9  ????

0x024C

 

Tag

Type

Count

Value

 

22 88

03 00

01 00 00 00

02 00 00 00

 

0x8822 à ExposureProgram

0x0003 à SHORT

0x00000001 à 1 SHORT 변수( 2바이트)

0x000000002 à offset 4바이트보다 작으면 offset 영역에 값(=2)이 저장됨. 2=Normal Program

 

 

Tag

Type

Count

Value offset

 

27 88

03 00

01 00 00 00

80 00 00 00

 

0x8827 à ISOSpeedRatings

0x0003 à SHORT

0x00000001 à 1 SHORT 변수( 2바이트) 

0x000000080) à 0x80 + 0x1E = 0x9E번째 바이트부터 2바이트의 정보임. 0x00

0x0264

 

Tag

Type

Count

Value

00 90

07 00

04 00 00 00

30 32 32 30

0x9000 à ExifVersion

0x0007 à Undefined (1바이트)

0x00000004 à 4개 바이트  

0x30323230 = “0220” (offset영역에 값이 저장됨)  

 

 

Tag

Type

Count

Value offset

 

03 90

02 00

14 00 00 00

C2 03 00 00

 

 

0x9003 à DateTimeOriginal

0x0002 à ASCII

0x00000014 à 20ASCII 문자(20 바이트)  

0x000003C2 à 0x03C2 + 0x1E = 0x03E0번째 바이트부터 20바이트의 정보임. “0000:00 00:00 00:00:00”

0x027C

 

Tag

Type

Count

Value offset

 

 

04 90

02 00

14 00 00 00

D6 03 00 00

 

 

0x9004 à DateTimeDigitized

0x0002 à ASCII

0x00000014 à 20ASCII 문자(20 바이트)  

0x000003D6 à 0x03D6 + 0x1E = 0x03F4번째 바이트부터 20바이트의 정보임. “0000:00 00:00 00:00:00”

 

 

Tag

Type

Count

Value

 

01 91

07 00

04 00 00 00

01 02 03 00

 

0x9101 à ComponentConfiguration

0x0002 à Undefined (1 바이트)

0x00000004 à 4 바이트  

0x00030201 à 1: Y, 2:Cb, 3: Cr (offset영역에 값이 저장됨)  

0x0294

 

Tag

Type

Count

Value offset

 

02 91

05 00

01 00 00 00

EA 03 00 00

 

 

0x9102 à CompressedBitsPerPixel

0x0005 à Rational, 2 SLONGs (8 바이트)

0x00000001 à 2SLONG 변수 (8 바이트)  

0x000003EA à 0x03EA + 0x1E = 0x408번째 바이트부터 8바이트의 정보임. 0x00000002 ÷ 0x00000001 = 2, ???

 

 

Tag

Type

Count

Value offset

 

 

04 92

0A 00

01 00 00 00

F2 03 00 00

 

 

0x9204 à ExposureBiasValue

0x000A à SRational, 2 SLONGs (8 바이트)

0x00000001 à 2SLONG 변수 (8 바이트)  

0x000003F2) à 0x03F2 + 0x1E = 0x410번째 바이트부터 8바이트의 정보임. 0x00000000 ÷ 0x0000000A = 0, ???

0x02AC

 

Tag

Type

Count

Value offset

 

 

05 92

05 00

01 00 00 00

FA 03 00 00

 

 

0x9205 à MaxApertureRatioValue

0x0005 à Rational, 2 LONGs (8 바이트)

0x00000001 à 2LONG 변수 (8 바이트)  

0x000003FA à 0x03FA + 0x1E = 0x418번째 바이트부터 8바이트의 정보임. 0x00000028 ÷ 0x0000000A = 4, ???

……

 

 

……

……

0x0318

 

Tag

Type

Count

Value

 

02 A0

04 00

01 00 00 00

00 08 00 00

 

0x0A02 à PixelXDimension

0x0004 à LONG (4 바이트)

0x00000001 à 1LONG 변수 (1 바이트)  

0x0000800 à 2,048 pixels (offset영역에 값이 저장됨)

0x0324

 

Tag

Type

Count

Value

 

03 A0

04 00

01 00 00 00

00 06 00 00

 

0x0A03 à PixelYDimension

0x0004 à LONG (4 바이트)

0x00000001 à 1LONG 변수 (1 바이트)  

0x0000600 à 1,536 pixels (offset영역에 값이 저장됨)

……

 

 

……

……

   

<9> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기3 (Exif IFD)

 







Offset

Marker

Fields

데이타

의미

0x082C

 

1st IFD

06 00

Number of Interoperability (=0x0006, 6)

0x082E

 

Tag

Type

Count

Value

 

03 01

03 00

01 00 00 00

06 00 00 00

 

0x829A à Copression

0x0003 à SHORT (2 바이트)

0x00000001 à 1SHORT 변수( 2바이트)

0x00000006 à 6=JPEC compression , Thumbnails only (offset영역에 값이 저장됨)

……

 

 

……

……

0x085E

 

Tag

 

 

Type

Count

Value

 

01 02

 

 

04 00

01 00 00 00

6C 08 00 00

 

0x829A à JPEGInterchangeFormat

   (Offset to the start byte of JPEG compressed thumbnail data)

0x0003 à LONG (4 바이트)

0x00000001 à 1SHORT 변수( 2바이트)

0x0000086C à 0x086C + 0x1E = 0x088A부터 Thumbnail 데이터 시작 (offset영역에 값이 저장됨)

0x086A

 

Tag

 

Type

Count

Value offset

 

 

02 02

 

04 00

01 00 00 00

EE 0E 00 00

 

 

0x0202 à JPEGInterchangeFormatLength

                               (JPEG 데이터의 크기)

0x0004 à LONG (2 바이트)

0x00000001 à 1 LONG 변수( 4바이트)

0x00000EEE à 3,822바이트,

   0x88A ~ 0x1777까지 Thumbnail 이미지 데이터 저장.

0x0876

 

Next IFD Offset

00 00 00 00

Next IFD가 없음


<10> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기4 (1st IFD)








    Thumbnail 사진의 데이터로 <그림 22>에서 보여준 것처럼 SOI, APP0, DQT,…,EOI 등의 독립적인 파일구조를 가진다.



 

<그림 27>APP1 Maker를 이용하여 카메라 업체에서 추가적인 정보를 제공하고 있다.

 



DQT (Quantization Table)

 

DQT(Define Quantization Table) 마커는 이미지에서 사용하는 양자화 상수 테이블을 정의한다. 하나의 DQT 마커는 4개의 양자화 상수 테이블을 지정할 수 있다. <그림 28>







Offset

Marker

Fields

데이타

의미

0x189C

DQT

 

FF DB

Define Quantization Table

0x189E

 

Data length

00 84

데이터 길이 (0x0084) : 2바이트 + DQT 정보 1바이트 + 2개 양자화 테이블(2*64바이트)

à 0x189E ~ 0x1921

0x18A0

 

양자화 테이블 정보

00

4 lower bit (0) : 테이블 번호는 0

4 higher bit(0) : 양자화 값의 바이트 수는 1byte (0: 1byte, 1: 2byte)

0x18A0

 

양자화 테이블

03 02 02 08 0A 0A 08 08 0A 08

08 08 08 08 09 08 06 09 09 09

09 07 07 08 06 08 07 07 07 07

07 07 07 07 07 07 07 07 07 07

07 07 07 07 07 0A 07 07 07 08

09 09 09 07 07 0B 0D 0A08 0D

07 08 09 08

8x8 블럭에 대한 0번 양자화 상수 테이블0zig-zag로 표현한 값들

0x18E1

 

양자화 테이블 정보

01

4 lower bit (1) : 테이블 번호는 1

4 higher bit(0) : 양자화 값의 바이트 수는 1byte (0: 1byte, 1: 2byte)

0x18E2

 

 

03 04 04 06 05 06 0A 0D 06 06

0A 0D 0D 0B 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D0D 0D 0D 0D 0D 0D

0D 0D 0D 0D 0D 0D 0D 0D 0D 0D

0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D

8x8 블럭에 대한 1번 양자화 상수 테이블을 zig-zag로 표현한 값들

<11> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기7(DQT)






 

SOF0 (Start Of Frame 0)








Offset

Marker

Fields

데이타

의미

0x1922

SOF0

 

FF C0

Start Of Frame

0x1924

 

Data length

00 11

데이터 길이 (0x0011) : 2바이트 + DQT 정보 1바이트 + 2개 양자화 테이블(2*64바이트)

à 0x1924 ~ 0x1934

0x1926

 

Sample Precision

08

컬러 샘플링 정밀도(8bit) à 0~255로 컬러 표현

0x1927

 

Y축 픽셀 수

06 00

1,536픽셀

0x1929

 

X축 픽셀 수

08 00

2,048픽셀

0x192B

 

컬러 Component

03

3가지 컬러 성분 표현(Y Cb Cr)

0x192C

 

Component 번호

01

Y-성분

0x192D

 

샘플링

22

4 lower bit(2) : X-Y 데이터의 샘플링 (H) à 2개 데이터마다 샘플링

4 higher bit(2) : Y- Y 데이터의 샘플링(V) à 2개 데이터마다 샘플링

H=2, V=1 : X-축에서 2 데이타 중 1개 샘플링

H=2, V=2 : X-Y축 모두에서 2개 데이타 중 1개를 샘플링

0x192E

 

양자화 테이블 번호

00

DQT 마커에서 설정한 0번 테이블

0x192F

 

Component 번호

02

Cb-성분

0x1930

 

샘플링

11

4 lower bit(1) : X- Cb데이터의 샘플링(H) à Downsampling 없음.

4 higher bit(1) : Y-Cb 데이터의 샘플링(V) à Downsampling 없음.

0x1931

 

양자화 테이블 번호

01

DQT 마커에서 설정한 1번 테이블

0x1932

 

Component 번호

03

Cr-성분

0x1933

 

샘플링

11

4 lower bit(1) : X-Cr 데이터의 샘플링(H) à Downsampling 없음.

4 higher bit(1) : Y-Cr 데이터의 샘플링(V) à Downsampling 없음.

0x1934

 

양자화 테이블 번호

01

DQT 마커에서 설정한 1번 테이블 à Cb와 동일한 테이블 이용함

<12> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기8(SOF0)



< 12>에서 Y성분의 샘플링 정보인 0x22, CbCr의 샘플링 정보인 0x11의 의미는 는 <그림 8>에서 살펴본 채도 샘플링 정의와 비교하면 4:2:0샘플링이다.



 

4:2:0

4:2:2

Y의 샘플링 정보

0x22

X-, Y-: Downsampling 없음

0x21

X-, Y-: Downsampling 없음

Cb의 샘플링 정보

0x11

X-: 데이터 2개마다 샘플링

Y-: 데이터 2개마다 샘플링

0x11

X-: 데이터 2개마다 샘플링

Y-: Downsampling 없음

Cr의 샘플링 정보

0x11

X-: 데이터 2개마다 샘플링

Y-: 데이터 2개마다 샘플링

0x11

X-: 데이터 2개마다 샘플링

Y-: Downsampling 없음

<13> 채도 샘플링 정보







DHT (Huffman Table)

 






Offset

Marker

Fields

데이타

의미

0x1935

DHT

 

FF C4

Huffman table

0x1937

 

Data length

00 1D

데이터 길이(29byte)

0x1939

 

테이블 분류

00

4 lower bit(0): table class(0: DC table, 1: AC table) à DC table

4 higher bit(0): 테이블 번호(0~3)

0x193A

 

Huffman code counts

00 02 02 03 01 01 01 00

00 00 00 00 00 00 00 00

길이가 1bit인 심벌은 각 0,

길이가 2bit인 심벌은 각 2,

길이가 3bit인 심벌은 각 2,

길이가 4bit인 심벌은 각 3,

길이가 5~7bit인 심벌은 각 1

길이가 8~16bit인 심벌은 각 0

 à 10개의 심벌이 있음.

0x194A

 

Symbols

01 02 00 03 04 05 06 07 08 09

10개의 심벌을 순서대로 배열

01: 2bit coding, 02: 2bit coding

00: 3bit coding, 03: 3bit coding

04: 4bit coding, 05: 4bit coding

06: 4bit coding, 07: 5bit coding

08: 6bit coding, 09: 7bit coding

<14> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기9(DHT)



Huffman table을 보면 각 심벌에 대한 코드는 정의되지 않고, 각 심벌의 코드 길이만 정의하고 있다. Huffman table을 구성하는 순서를 역으로 따라가면 심벌들의 코드 값을 알 수 있다[3]. , 위로부터 밑으로 트리를 만들어가고, 왼쪽에서 오른쪽으로 각 코드 길이를 가지는 노드에 심벌을 부여하는 것이다. 심벌이 부여된 노드는 더 이상 가지를 만들지 않고, 아직 심벌이 부여되지 않은 노드에 대해서만 계속 가지를 만들어 간다.





가지의 왼쪽은 이진수 0, 오른 쪽을 이진수 1로 하면, 트리으로부터 Huffman coding 결과는 <14>와 같이 정리된다.


 

Symbol

Coding

Code length

0x00

100

3

0x01

00

2

0x02

01

2

0x03

101

3

0x04

1100

4

0x05

1101

4

0x06

1110

4

0x07

11110

5

0x08

111110

6

0x09

1111110

7


            <15> Huffman coding 결과1






 

Offset

Marker

Fields

데이타

의미

0x1954

DHT

 

FF C4

Huffman table

0x1956

 

Data length

00 51

데이터 길이(81byte)

0x1958

 

테이블 분류

10

4 lower bit(0): table class(0: DC table, 1: AC table) à AC table

4 higher bit(0): 테이블 번호(0~3)

0x1959

 

Huffman code counts

00 01 03 02 04 02 05 0A

05 03 02 05 03 02 00 0F

길이가 1bit인 심벌은 각 0,

길이가 2bit인 심벌은 각 1,

길이가 3bit인 심벌은 각 3,

길이가 4bit인 심벌은 각 2

길이가 5bit인 심벌은 각 4

길이가 6bit인 심벌은 각 2

길이가 7bit인 심벌은 각 5

길이가 8bit인 심벌은 각 10

길이가 9bit인 심벌은 각 5,

길이가 10bit인 심벌은 각 3,

길이가 11bit인 심벌은 각 2,

길이가 12bit인 심벌은 각 5

길이가 13bit인 심벌은 각 3

길이가 14bit인 심벌은 각 2

길이가 15bit인 심벌은 각 0

길이가 16bit인 심벌은 각 15

 à 62개의 심벌이 있음.

0x1969

 

Symbols

01 00 02 11 03 21 04 12 31 41

51 61 05 22 71 81 F0 06 13 32

42 52 62 91 A1 B1 D1 07 72 C1

E1 F1 08 23 82 14 C2 33 92 A2

B2 D2 15 43 53 E2 24 F2 34 44

63 73 09 16 17 25 64 18 26 54

93 B3

62개의 심벌을 순서대로 배열

01: 2bit coding, 00: 3bit coding

02: 3bit coding, 11: 3bit coding

03: 4bit coding, 21: 4bit coding

04: 5bit coding, 12: 5bit coding

31: 5bit coding, 41: 5bit coding

51: 6bit coding, 61: 6bit coding

05: 7bit coding, 22: 7bit coding

71: 7bit coding, 81: 7bit coding

F0: 7bit coding, 06: 8bit coding

13: 8bit coding, 32: 8bit coding

42: 8bit coding, 52: 8bit coding

62: 8bit coding,  91: 8bit coding

A1: 8bit coding, B1: 8bit coding

D1: 8bit coding. 07: 9bit coding

72: 9bit coding, C1: 9bit coding

E1: 9bit coding,  F1: 9bit coding

08: 10bit coding, 23: 10bit coding

82: 10bit coding, 14: 11bit coding

C2: 11bit coding,  33: 12bit coding

92: 12bit coding,  A2: 12bit coding

B2: 12bit coding,  D2: 12bit coding

15: 13bit coding, 43: 13bit coding

53: 13bit coding, E2: 14bit coding

24: 14bit coding,

F2, 34, 44, 63, 73, 09, 16, 17, 25, 64, 18, 26, 54, 93, B3 : 16bit coding

<16> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기10(DHT)




가장 긴 코드의 길이가 16bit이고, 심벌의 수가 62개이기 때문에 수작업으로 각 심벌에 대한 Huffman code를 구하는 것은 복잡하면서 지루한 일이다. JPEGsnoop.exe라는 프로그램을 이용하면 Huffman code를 볼 수 있다.


Symbol

Coding

Code length

Symbol

Coding

Code length

0x00

010

3

0x44

1111111111110010

16

0x01

00

2

0x51

111000

6

0x02

011

3

0x52

11110110

8

0x03

1010

4

0x53

1111111111100

13

0x04

11000

5

0x54

1111111111111100

16

0x05

1110100

7

0x61

111001

6

0x06

11110010

8

0x62

11110111

8

0x07

11111100

8

0x63

1111111111110011

16

0x08

1111111010

10

0x64

1111111111111001

16

0x09

1111111111110101

16

0x71

1110110

7

0x11

100

3

0x72

111111001

9

0x12

11001

5

0x73

1111111111110100

16

0x13

11110011

8

0x81

1110111

8

0x14

11111111010

11

0x82

1111111100

12

0x15

1111111111010

13

0x91

11111000

9

0x16

1111111111110110

16

0x92

111111111001

12

0x17

1111111111110111

16

0x93

1111111111111101

16

0x18

1111111111111010

16

0xA1

11111001

8

0x21

1011

4

0xA2

111111111010

12

0x22

1110101

7

0xB1

11111010

8

0x23

1111111011

10

0xB2

111111111011

12

0x24

11111111111011

14

0xB3

1111111111111110

16

0x25

1111111111111000

16

0xC1

111111010

9

0x26

1111111111111011

16

0xC2

11111111011

11

0x31

11010

5

0xD1

11111011

8

0x32

11110100

8

0xD2

111111111100

12

0x33

111111111000

12

0xE1

111111011

9

0x34

1111111111110001

16

0xE2

11111111111010

14

0x41

11011

5

0xF0

1111000

7

0x42

11110101

8

0xF1

111111100

9

0x43

1111111111011

13

0xF2

1111111111110000

16




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 







    


                                            < 17> Huffman coding 결과2 






Offset

Marker

Fields

데이타

의미

0x19A7

DHT

 

FF C4

Huffman table

0x19A9

 

Data length

00 1C

데이터 길이(28byte)

0x19AB

 

테이블 분류

01

4 lower bit(0): table class(0: DC table, 1: AC table) à DC table

4 higher bit(1): 테이블 번호(0~3)

0x19AC

 

Huffman code counts

00 03 01 01 01 01 01 01

00 00 00 00 00 00 00 00

길이가 1bit인 심벌은 각 0,

길이가 2bit인 심벌은 각 3,

길이가 3bit인 심벌은 각 1,

길이가 4bit인 심벌은 각 1

길이가 5bit인 심벌은 각 1

길이가 6bit인 심벌은 각 1

길이가 7bit인 심벌은 각 1

길이가 8bit인 심벌은 각 1

길이가 9bit~16bit인 심벌은 각 0

 à 9개의 심벌이 있음.

0x19BC

 

Symbols

00 01 02 03 04 05 06 07 08

9개의 심벌을 순서대로 배열

00: 2bit coding, 01: 2bit coding

02: 2bit coding, 03: 3bit coding

04: 4bit coding, 05: 5bit coding

06: 6bit coding, 07: 8bit coding

08: 8bit coding

<18> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기11(DHT)

 







Offset

Marker

Fields

데이타

의미

0x19A7

DHT

 

FF C4

Huffman table

0x19A9

 

Data length

00 36

데이터 길이(54byte)

0x19AB

 

테이블 분류

11

4 lower bit(1): table class(0: DC table, 1: AC table) à AC table

4 higher bit(1): 테이블 번호(0~3)

0x19AC

 

Huffman code counts

00 02 02 02 02 02 03 00

01 03 03 02 05 05 00 03

길이가 1bit인 심벌은 각 0,

길이가 2bit인 심벌은 각 2,

길이가 3bit인 심벌은 각 2,

길이가 4bit인 심벌은 각 2

길이가 5bit인 심벌은 각 2

길이가 6bit인 심벌은 각 2

길이가 7bit인 심벌은 각 3

길이가 8bit인 심벌은 각 0

길이가 9bit인 심벌은 각 1

길이가 10bit인 심벌은 각 3

길이가 11bit인 심벌은 각 3

길이가 12bit인 심벌은 각 2

길이가 13bit인 심벌은 각 5

길이가 14bit인 심벌은 각 5

길이가 15bit인 심벌은 각 0

길이가 16bit인 심벌은 각 3

 

 à 35개의 심벌이 있음.

0x19BC

 

Symbols

00 01 11 21 02 31 03 41 12 51

04 61 71 22 05 13 32 14 81 91

42 B1 06 15 23 A1 F0 33 52 C1

D1 E1 F1 43 24

9개의 심벌을 순서대로 배열

00: 2bit coding, 01: 2bit coding

11: 3bit coding, 21: 3bit coding

02: 4bit coding, 31: 4bit coding

03: 5bit coding, 41: 5bit coding

12: 6bit coding, 51: 6bit coding

04: 7bit coding, 61: 7bit coding

71: 7bit coding, 22: 9bit coding

05: 10bit coding, 13: 10bit coding

32: 10bit coding, 14: 11bit coding

81: 11bit coding, 91: 11bit coding

42: 12bit coding, B1: 12bit coding

06: 13bit coding, 15: 13bit coding

23: 13bit coding, A1: 13bit coding

F0: 13bit coding, 33: 14bit coding

52: 14bit coding, C1: 14bit coding

D1: 14bit coding, E1: 14bit coding

F1: 16bit coding, 43: 16bit coding

24: 16bit coding

< 19> Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기12(DHT)

 







SOS (Start Of Scan)




  





Offset

Marker

Fields

데이타

의미

0x19FD

SOS

 

FF DA

Start Of Scan

0x19FF

 

Data length

00 0C

데이터 길이(12byte)

0x1A01

 

Components count

03

컬러 component (3): Y, Cb, Cr

0x1A02

 

Component selector

01

1 = Y

0x1A03

 

Huffman table selector

00

Lower 4 bit(0): AC Huffman table 번호

Higher 4 bit(0): DC Huffman table 번호

0x1A04

 

Component selector

02

2 = Cb

0x1A05

 

Huffman table selector

11

Lower 4 bit(1): AC Huffman table 번호

Higher 4 bit(1): DC Huffman table 번호

0x1A06

 

Component selector

03

3 = Cr

0x1A07

 

Huffman table selector

11

Lower 4 bit(1): AC Huffman table 번호

Higher 4 bit(1): DC Huffman table 번호

0x1A08

 

Scan start position in block

00

0, 0~63범위의 값을 가짐

0x1A09

 

Scan end position in block

3F

3F, 0~63범위의 값을 가짐

0x1A0A

 

Successive approximation Bit position

00

lower 4bit : 0~13값을 가짐

higher 4bit : 0~13값을 가짐

<20 > Ultraedit 편집기 이용한 P1010194.jpg의 바이너리 정보 보기13(SOS)

 






MCUs(Minimum Coded Units)







0x00001A0B ~ 0x0006313A 범위의 데이터는 MCU들을 Huffman code로 압축한 결과이다. 마지막 2바이트( FF D9) EOI(End Of Image) 마커이고 이미지 파일의 끝을 의미한다. MCU 데이터에서0xFF 뒤에 0x00이 오는 경우에는 0xFF가 데이터임을 의미하고, 0x000xFF를 마커로부터 구분해주기 위한 더미 데이터이다.


   MCU 해석은 JPEG 파일의 디코딩을 위한 가장 중요한 과정이다. 하지만, JPEG 관련 기술을 찾아보면서 공부하고, 디지털 사진 하나 분석하다 보니 머리도 뻐근하고 시간도 많이 걸릴 것 같다. 나중에 정현이와 소연이가 각각 대학교에서 공부하고나면 MCU 데이터 해석까지 마무리해서 JPEG 파일을 완전히 디코딩 해주었으면 하는 바램이다.







[1] https://en.wikipedia.org/wiki/JPEG

[2] http://www.exiv2.org/Exif2-2.PDF

[3] http://www.impulseadventure.com/photo/jpeg-huffman-coding.html