ここからは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]
次のページ