이제<그림 1>의 디지털 사진(P1010194.jpg)의 바이트 정보를 파악하여 실제로 어떤 포맷으로 파일이 구성되어 있고, 압축된 정보가 어떻게 저장되어 있는 지 살펴보고자 한다. 사진 데이터의 분석은 울트라에이트(Ultraedit) 소프트웨어를 이용하여 JPEG 파일의 핵사 값들을 읽고, 표준 JPEG 표준 포맷 정의와 비교하면서 진행한다.
Ultraedit 편집기로 JPEG파일을 열면 파일은 0xFFD8로 시작하는 데, 이는 SOI(Start Of Image)를 의미하는 ‘Marker’이다. Marker는 JPEG파일에서 구조를 구분하는 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 영역에 저장된다.
SOI와 APPn
이제부터 바이트 하나하나를 읽고 확인한다.
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 à 1개 SHORT (총 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 à 1개 Rational (총 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 à 1개 Rational (총 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 à 1개 SHORT (총 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 à 8개 ASCII 문자 (총 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 à 20개 ASCII 문자 (총 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 à 1개 LONG 변수 (총 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 à 20개 ASCII 문자(총 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 à 20개 ASCII 문자(총 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 à 2개 SLONG 변수 (총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 à 2개 SLONG 변수 (총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 à 2개 LONG 변수 (총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 à 1개 LONG 변수 (총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 à 1개 LONG 변수 (총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 à 1개 SHORT 변수(총 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 à 1개 SHORT 변수(총 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번 양자화 상수 테이블0을 zig-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가 데이터임을 의미하고, 0x00는 0xFF를 마커로부터 구분해주기 위한 더미 데이터이다.
MCU 해석은 JPEG 파일의
디코딩을 위한 가장 중요한 과정이다. 하지만, JPEG 관련 기술을
찾아보면서 공부하고, 디지털 사진 하나 분석하다 보니 머리도 뻐근하고 시간도 많이 걸릴 것 같다.
나중에 정현이와 소연이가 각각 대학교에서 공부하고나면 MCU 데이터 해석까지 마무리해서 JPEG 파일을 완전히 디코딩 해주었으면 하는
바램이다.
'디지털 사진 한 장에 대한 궁금증' 카테고리의 다른 글
3. 디지털 사진에서의 정보 압축 (1) | 2018.10.02 |
---|---|
2. 디지털 사진 파일에 포함된 정보 (0) | 2018.09.30 |
1. 디지털 사진 한 장 (0) | 2018.09.30 |