プログレッシヴJPEG画像のアルゴリズムとフォーマットについて解説します。
プログレッシヴJPEGとは、読込途中でモザイク状に表示され、読込が進むにつれて段々細かく表示されていくタイプのJPEG画像の事です。
まず、ベースライン方式JPEGの仕組みを理解しておきましょう。
プログレッシヴJPEGでは、圧縮する範囲を区切って区切りごとに処理します。
プログレッシヴJPEGでのデータの区切り方には二種類の方法があり、実際にはこの二種類を組み合わせております。
DCT変換後の64個のブロックについて、ブロックの番号(周波数)の範囲で分割します。
このとき直流成分(0番目の成分)と交流成分(その他の成分)は常に別々に処理されます。
例えば、三分割なら以下のようになるでしょう。
各成分は8ビット(プログレッシヴJPEGの場合は12ビットも許されていますが、余り見かけません)のデータが入りますが、これらをビットごとに区切って処理します。
実際には上位ビットから順に処理され、一回目以外は一ビットづつ処理する事となっております。
例えば、8ビットのデータを三分割する場合は以下のようになります。
プログレッシヴJPEGでのデータの区切りには以下のルールが適用されます。
プログレッシヴJPEGでの圧縮方法は、DCT変換後の成分を量子化した後で上記の分割を行ないます。
分割後のデータに関して、処理を行なって行きます。
直流成分は逐次近似を行なう場合に限り二回以上の処理が行なわれます。
一回目(上位ビット)はベースライン方式JPEGと全く同じで、前のブロックの直流成分との差分を取った値をハフマン符号で表現します。
二回目以降は1ビットづつ処理されるため、当該ビットそのものがそのままデータとなります。
交流成分も逐次近似により処理が異なります。
交流成分もベースライン方式JPEGと殆ど同じですが、データの形式が若干異なります。
具体的にはベースライン方式JPEGでのEOB符号の代りに、以下の符号が定義されております。
EOBn符号とは、ゼロランレングスを拡張した符号です。
EOBn符号の直後にnビットのデータが続きます。
この後続データの値lとnから導き出された値をmとしたとき、現在処理中のブロックを含めたm個の後続ブロックをスキップします。
具体的には以下の関係になります。
ですから、EOB0ではm=1となり、現在処理中のブロックの残りデータをスキップするだけ…つまり、ベースライン方式JPEGでのEOBと全く同じ事になります。
二回目以降の逐次近似では常に1ビットのみの処理となります。
データ符号は常に1ビットですが、ZRL符号やEOBn符号があるため、やはりハフマン符号で表現されます。
また、符号の意味が一回目と異なっております。
具体的には、ベースライン方式JPEGや一回目の逐次近似での連続ゼロデータ数をあらわす符号はやはりゼロデータの個数を表しますが、このゼロデータは連続していなくても構わないとされております。
指定された個数のゼロデータをスキップするまでの間に現れる非ゼロデータには各々に1ビットの補正データが与えられ、そのビットが1の時にはビット補正が行なわれます。
また、EOBn符号は直後にnビットのデータが続き、この値lとnから導き出される値mとしたとき、現在処理中のブロックを含めたm個の後続ブロックに関して、非ゼロデータの補正処理のみを行なうものとします。
この補正には後続の1ビットデータが用いられます。
ですから、EOBn符号は以下のような構造になります。