オフセット | 内容(バイト数) |
---|---|
0 | マーカー識別子(1) 固定値FFH |
1 | SOF0マーカー(1) 固定値C0H |
2 | フィールドの長さ(2) バイト単位 |
4 | サンプルの精度(1) ビット単位 |
5 | イメージの行数(2) 整数 |
7 | イメージの列数(2) 整数 |
9 | 構成要素数(1) 整数 |
10 | 構成要素識別子(1) 整数コード |
11 | サンプル化要因(1) 4ビット単位のコード |
12 | 量子化テーブルの識別子(1) 整数 |
: | : |
データがハフマン符号化法で符号化されたデータ(フレームタイプ0)であることを表すセグメントで、DCTデータをハフマン符号化する時の各種バラメータを定義しています。
このバイトと次のバイトがマーカーであることを識別するためのデータで、常に固定値FFHです。
SOF0セグメントであることを表すマーカーで、常に固定値C0Hです。
マーカーに続くフィールドのバイト数を表すデータで、このデータ自体も含めた値です。 この値に2を足した値がセグメントの長さになります。
DCTデータの精度をビット単位で表した値で8または12です。 ベースラインJPEGでは常に8です。
イメージの行数(高さ)と列数(横幅)をピクセル単位で表した値です。
DCTデータの構成要素の数を表す値で、通常はY、Cb、Crの3種類ですから3です。 このデータに続く構成要素識別子(Ci)、サンプル化要因(H/V)、量子化テーブルの番号(Tqi)の3つのフィールドは、3つ1組で構成要素数だけ存在します。
構成要素の種類を表す整数コードで、以下のような種類があります。
ハフマン符号化されたデータは、ここで定義された構成要素順に並んでいます。
サブサンプリングした時の比率を表す値で、上位4ビットが水平方向の比率、下位4ビットが垂直方向の比率を表します。 例えばサンプリング比率を4対1として、2×2(=4)ピクセルの領域ごとに、Yデータはそのまま4データをサンプリングし、CbとCrは4ピクセルの平均値を各1データとしてサブサンプリングした場合、YデータとCb、Crデータの水平方向の比率と垂直方向の比率はどちらも2:1になります。 したがって、Yに関するサンプル化要因データは22H(上位4ビット=2、下位4ビット=2)、Cb・Crに関するサンプル化要因データは11H(上位4ビット=1、下位4ビット=1)となります。
DCTデータを量子化した量子化テーブルの識別子で、DQTセグメント中の量子化テーブル識別子(P/Tの下位4ビット)に対応した値(Y要素は0、Cb・Cr要素は1で、3以上は非ベースラインJPEGとなる)です。
オフセット | 内容(バイト数) |
---|---|
0 | マーカー識別子(1)固定値FFH |
1 | DHTマーカー(1) 固定値C4H |
2 | フィールドの長さ(2) バイト単位 |
4 | DHTのクラスと識別子(1) 4ビット単位のコード |
5 | コード長ごとのコード数(16) 整数 |
21 | 各コード長のコード(可変) 8ビットコード |
: | : |
ハフマン符号化法における可変長コードと、固定長コードの対応表を定義したセグメントです。
このバイトと次のバイトがマーカーであることを識別するためのデータで、常に固定値FFHです。
DHTセグメントであることを表すマーカーで、常に固定値C4Hです。
マーカーに続くフィールドのバイト数を表すデータで、このデータ自体も含めた値です。 この値に2を足した値がセグメントの長さになります。
DHT(ハフマン符号表)のクラスと識別子を表すデータで、クラスは上位4ビットに、識別子は上位4ビットに保存されます。 DHTのクラスとはDC成分用かAC成分用かを表す整数コードで、以下のような種類があります。
DHTの識別子は量子化テーブルの識別子と同様、Yに関するテーブルはコード0、Cb・Crに関するテーブルはコード1で、3以上は非ベースラインJPEGになります。
DCTデータつまり離散コサイン変換したYCbCrスペクトルデータは、F(0,0)からF(7,7)まで64個の成分を含んでいますが、最初のF(0,0)成分は三角関数を含まない定数成分で、後のF(0,1)〜F(7,7)は三角関数を含んだ周期成分です。 このためF(0,0)のことを「直流成分(DC成分)」、F(0,1)〜F(7,7)のことを「交流成分(AC成分)」と呼びます。 DC成分が63個のピクセルの平均輝度を表す値であるのに対して、交流成分は平均輝度からの変化を表す値であり、お互いにデータの特徴が異なりますので、量子化もハフマン符号化も別々に行います。
Liはハフマンコード化された可変長コードについて、各コード長のコードがいくつあるかを表す値で、コード長1(ビット)から16までの16個(各コード1バイトの計16バイト)あります。 例えばコード長1のコードが0個、コード長2が2個、コード長3が4個、コード長4が1個、コード長5〜16が0個の場合、データは「00H 02H 04H 01H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H 00H」となります。 この場合、ハフマンコードは7個あり、
となります。
Vijは、Liで示されたハフマンコードに対応する8ビット固定長コードを表し、上の例で、
と対応していたとしますと、「00H 06H 03H 04H 05H 08H 02H」となります。
なおDHTセグメントは、DHTテーブルのクラスと識別子(Tc/Th)、コード長ごとのコード数(Li)、各コード長のコード(Vij)の3つのデータで構成されたDHTテーブルを複数個含むことができます。