lain画集のBinHexエンコードされた画像を見る(9)
フレームヘッダー
table: innocent.jpg_フレームヘッダー
データ名 バイト数 実際のデータ(16進) 説明
マーカー 2 FF C0 フレームヘッダー
セグメント長 2 00 11 17
成分数 1 08 8
画像縦サイズ 2 01 40 320
画像横サイズ 2 00 8E 142
成分数 1 03 3
成分ID等1 3 01 22 00 1, 2, 2, 0 (Y)
成分ID等2 3 02 11 01 2, 1, 1, 1 (Cb)
成分ID等3 3 03 11 01 3, 1, 1, 1 (Cr)
※成分ID等は成分ID、水平サンプリング値、垂直サンプリング値、対応量子化テーブル番号
innocent.jpgは320x142ピクセルの画像であると分かる。あとサンプリング比は4:2:0(らしい)。
リスタートインターバル定義
table: innocent.jpg_リスタートインターバル定義
データ名 バイト数 実際のデータ(16進) 説明
マーカー 2 FF DD リスタートインターバル定義
セグメント長 2 00 04 4
リスタートインターバル間隔 2 00 09 9
後述のイメージデータに誤りがあるとそれ以降全てに影響が出る(前の値との差で記録しているっぽい)のでデータの破損等があると大変なことになるが、一定間隔で差の計算を始める基準の地点を設けることで影響範囲を狭めるためにリスタートマーカーが用いられる。ここではリスタートマーカーが置かれる間隔を定義している。
サンプリング比的に16x16で処理が進むと思われ、それが9個ごとにリスタートで16x9=144、画像の横幅は142ピクセルなので、誤りがあっても縦16ピクセルごとの範囲にしか影響がないということになる。
ハフマンテーブル定義
table: innocent.jpg_ハフマンテーブル定義
データ名 バイト数 実際のデータ(16進) 説明
マーカー 2 FF C4 ハフマンテーブル定義
セグメント長 2 01 3F 319
(DC成分0) Photoshop輝度DC HT 低画質
ハフマンテーブルクラス・番号 1 00 DC成分・0
ハフマンテーブルビット配分数 16 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 2, 4~9ビットのコードが1つずつ、3ビットのコードが5つ
2ビットのコード 1 03 3 (データビット数)
3ビットのコード 5 00 01 02 04 05 0, 1, 2, 4, 5 (データビット数)
4ビット 1 06 6
5ビット 1 07 7
6ビット 1 08 8
7ビット 1 09 9
8ビット 1 0A 10
9ビット 1 0B 11
(DC成分1) Photoshop色差DC HT 低画質
ハフマンテーブルクラス・番号 1 01 DC成分・1
ハフマンテーブルビット配分数 16 00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00 2, 4~9ビットのコードが1つずつ、3ビットのコードが5つ
2ビットのコード 1 01 1 (データビット数)
3ビット 5 00 02 03 04 05 0, 2, 3, 4, 5 (データビット数)
4ビット 1 06 6
5ビット 1 07 7
6ビット 1 08 8
7ビット 1 09 9
8ビット 1 0A 10
9ビット 1 0B 11
(AC成分0) Photoshop輝度AC HT 低画質
ハフマンテーブルクラス・番号 1 10 AC成分・0
ハフマンテーブルビット配分数 16 00 01 04 01 03 02 04 02 05 07 06 08 05 03 0C 33
2ビットのコード 1 01 (0,1) (ランレングス数・データビット数)
3ビット 4 00 02 11 03 (0,0), (0,2), (1,1), (0,3)
4ビット 1 04 (0,4)
5ビット 3 21 12 31 (2,1), (1,2), (3,1)
6ビット 2 05 41 (0,5), (4,1)
7ビット 4 51 61 13 22 (5,1), (6,1), (1,3), (2,2)
8ビット 2 71 81 (7,1), (8,1)
9ビット 5 32 06 14 91 A1 (3,2), (0,6), (1,4), (9,1) (10,1)
10ビット 7 B1 42 23 24 15 52 C1 (11,1), (4,2), (2,3), (2,4), (1,5), (5,2), (12,1)
11ビット 6 62 33 34 72 82 D1 (6,2), (3,3), (3,4), (7,2), (8,2), (13,1)
12ビット 8 43 07 25 92 53 F0 E1 F1 (4,3), (0,7), (2,5), (9,2), (5,3), (15,0), (14,1), (15,1)
13ビット 5 63 73 FD 16 A2 (6,3), (7,3), (15,13), (1,6) (10,2)
14ビット 3 B2 83 26 (11,2), (8,3), (2,6)
15ビット 12 44 93 54 64 45 C2 A3 74 36 17 D2 55 (4,4), (9,3), (5,4), (6,4), (4,5), (12,2), (10,3), (7,4), (3,6), (1,7), (13,2), (5,5)
16ビット 51 E2 65 F2 B3 ... C7 D7 E7 F7 (14,2), (6,5), (15,2), (11,3), ..., (12,7), (13,7), (14,7), (15,7)
(AC成分1) (Photoshop色差AC HT 低画質)
ハフマンテーブルクラス・番号 1 11 AC成分・1
ハフマンテーブルビット配分数 16 00 02 02 01 02 04 04 03 04 05 06 07 07 06 05 35
2ビット 2 01 00 (0,1), (0,0)
3ビット 2 02 11 (0,2), (1,1)
4ビット 1 03 (0,3)
5ビット 2 21 31 (2,1), (3,1)
6ビット 4 12 04 41 51 (1,2), (0,4), (4,1), (5,1)
7ビット 4 61 71 22 13 (6,1), (7,1), (2,2), (1,3)
8ビット 3 05 32 81 (0,5), (3,2), (8,1)
9ビット 4 91 14 A1 B1 (9,1), (1,4), (10,1), (11,1)
10ビット 5 42 23 C1 52 D1 (4,2), (2,3), (12,1), (5,2), (13,1)
11ビット 6 F0 33 24 62 E1 72 (15,0), (3,3), (2,4), (6,2), (14,1), (7,2)
12ビット 7 82 92 43 53 15 63 73 (8,2), (9,2), (4,3), (5,3), (1,5), (6,3), (7,3)
13ビット 7 34 F1 25 06 16 A2 B2 (3,4), (15,1), (2,5), (0,6), (1,6), (10,2), (11,2)
14ビット 6 83 07 26 35 C2 D2 (8,3), (0,7), (2,6), (3,5), (12,2), (13,2)
15ビット 5 44 93 54 A3 17 (4,4), (9,3), (5,4), (A,3), (1,7)
16ビット 53 64 45 55 36 ... 97 A7 B7 C7 (6,4), (4,5), (5,5), (3,6), ..., (9,7), (10,7), (11,7), (12,7)
ハフマンテーブルについてはググってください。このテーブルを使ってこの後出てくるイメージデータ部に記録されているビット列を紐解く…みたいな感じだと思われます。
とりあえずJpegAnalyzer Plusでそれぞれのテーブルが既知のものになり(Photoshop輝度DC HT 低画質、Photoshop色差DC HT 低画質、Photoshop輝度AC HT 低画質、Photoshop色差AC HT 低画質)、全体としても既知のものになり(Photoshop 画質3-5(IR11-40))、量子化テーブルの"画質4"とも合致したのでこれでよいのかしらん…?
一応省略したAC成分の16ビットのデータも置いておきます。
AC成分0
E2 65 F2 B3 84 C3 D3 75 E3 F3 46 27 94 A4 85 B4 95 C4 D4 E4 F4 A5 B5 C5 D5 E5 F5 56 66 76 86 96 A6 B6 C6 D6 E6 F6 37 47 57 67 77 87 97 A7 B7 C7 D7 E7 F7
AC成分1
64 45 55 36 74 65 E2 F2 B3 84 C3 D3 75 E3 F3 46 94 A4 85 B4 95 C4 D4 E4 F4 A5 B5 C5 D5 E5 F5 56 66 76 86 96 A6 B6 C6 D6 E6 F6 27 37 47 57 67 77 87 97 A7 B7 C7
次でやっとイメージデータに到達する…(まあ最後の部分に記録されるものなので当然ではあるが)