ここからはCR2形式内部のLossless JPEG(ロスレスJPEG)を読み解いていきます。
理解を簡略化するために、CR2形式からLossless JPEG部分を抜き出したファイルで説明をします。
(IMG_2026_IFD3_JPEG.jpg 参照)
CR2形式内のLossless JPEGは開始終了マーカーを除くと、大きく3つのセクションに分けることができます。
Marker | 名称 | 説明 |
---|---|---|
0xFFD8 | Start Of Image (SOI) | 圧縮画像の始まり |
0xFFC4 | Define Huffman Tables (DHT) | ハフマンテーブル定義 |
0xFFC3 | Start Of Frame :Lossless (sequential) (SOF3) | フレームの開始 Lossless 非differential, Huffman coding |
0xFFDA | Start Of Scan (SOS) | スキャン画像の始まり |
0xFFD9 | End Of Image (EOI) | 圧縮画像の終わり |
アドレス0x0000 0002 から2byte(0xFF 0xC4)は、DHTのMarkerです。
アドレス0x0000 0004 から2byte(0x00 0x42)は自身を含むセグメント長さ(Lh)です。このセグメント長さは66byteになります。
アドレス0x0000 0006 から1byte(0x00)のうち上位4bitはDC/ACいずれかに用いるテーブルかを示します。Lossless JpegではDC成分しかありませんので常に0です。(Tc)
下位4bitはハフマンテーブルのindexになります(Th)。サンプルは0ですので、今から記述するものはindex 0番のハフマンテーブルになります。
アドレス0x0000 0007から16byteは各bit長で表されるシンボルの数になります。
シンボルのbit長 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
シンボルの個数 | 0x00 | 0x01 | 0x04 | 0x02 | 0x03 | 0x01 | 0x01 | 0x01 | 0x01 | 0x01 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 | 0x00 |
つまり1bit長のシンボルは0個、2bit長のシンボルは1個、3bit長のシンボルは4個のようになります。
ここから具体的なハフマンツリーを構成していきます。
1bit長のシンボルは0個ですので、考慮不要です。
2bit長のシンボルは1個です。
ここで2bit長のシンボルは 00 01 10 11の4種類があります。この中で最も小さく、かつ今までの選択したものと重複しないものを選んでいきます。
よって 00 を選択します。
3bit長のシンボルは4個です。
ここで3bit長さのシンボルは 000 001 010 011 100 101 110 111 です。この中で 000 001 については、2bit長で選択した 00 と重複するため除外します。
結果として残りから4個を選びますので、010 011 100 101 になります。
これは木構造で簡単に表現できます。
頂点のRの丸を根、白色の丸が接点、黄色の丸を葉と呼びます。根から順にたどっていき、葉にたどり着いたらそこでその値を確定させます。
結果としてサンプルでは以下のようになります。
シンボル |
---|
00 |
010 |
011 |
100 |
101 |
1100 |
1101 |
11100 |
11101 |
11110 |
111110 |
1111110 |
11111110 |
111111110 |
1111111110 |
アドレス0x0000 0017からシンボルの個数byte分はハフマンツリーの葉に割り当てられる値を意味しています。
サンプルはシンボル数が15ですので、順に0x06,0x04,0x08....0x0Eと15byte分を、先ほどの表に割り当てます。
シンボル | 値 |
---|---|
00 | 0x06 |
010 | 0x04 |
011 | 0x08 |
100 | 0x05 |
101 | 0x07 |
1100 | 0x03 |
1101 | 0x09 |
1110 0 | 0x00 |
1110 1 | 0x0A |
1111 0 | 0x02 |
1111 10 | 0x01 |
1111 110 | 0x0C |
1111 1110 | 0x0B |
1111 1111 0 | 0x0D |
1111 1111 10 | 0x0E |
アドレス0x0000 0026は0x0000 0006と同様にTcおよびThが格納されています。
値は0x01ですので、これから記述するものはindex 1番のハフマンテーブルになります。
サンプルでは0番のハフマンテーブルとまったく同じ値ですので、同じテーブルが算定されることになります。
次ページ:Lossless JPEGのデコード2 - SOF3とSOS
前のページ
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
次のページ