プログレッシヴJPEG画像形式の概要。

プログレッシヴJPEG画像のアルゴリズムとフォーマットについて解説します。

プログレッシヴJPEGとは。

プログレッシヴJPEGとは、読込途中でモザイク状に表示され、読込が進むにつれて段々細かく表示されていくタイプのJPEG画像の事です。

プログレッシヴJPEGを実現するために。

まず、ベースライン方式JPEGの仕組みを理解しておきましょう。

プログレッシヴJPEGでは、圧縮する範囲を区切って区切りごとに処理します。

プログレッシヴJPEGでのデータの区切り方には二種類の方法があり、実際にはこの二種類を組み合わせております。

周波数選択
DCT変換後の64個のブロックについて、ブロックの番号(周波数)の範囲で分割します。

このとき直流成分(0番目の成分)と交流成分(その他の成分)は常に別々に処理されます。

例えば、三分割なら以下のようになるでしょう。

  1. 直流成分(0番目の成分)
  2. 交流成分1(1〜n番目の成分)
  3. 交流成分2(n+1〜63番目の成分)
逐次近似
各成分は8ビット(プログレッシヴJPEGの場合は12ビットも許されていますが、余り見かけません)のデータが入りますが、これらをビットごとに区切って処理します。

実際には上位ビットから順に処理され、一回目以外は一ビットづつ処理する事となっております。

例えば、8ビットのデータを三分割する場合は以下のようになります。

  1. 上位6ビット(ビット2〜ビット7まで)
  2. その下の1ビット(ビット1)
  3. 最下位の1ビット(ビット0)
  • 尚、逐次近似では処理されない下位ビットは詰められ、処理される最下位ビットが0番ビットにシフトされます。

プログレッシヴJPEGでのデータの区切りには以下のルールが適用されます。

  • 周波数選択での直流成分交流成分とは常に別の処理となります。
  • 直流成分はY, Cr及びCbデータを纏めて一つの処理とする事が出来ますが、交流成分は一回の処理でY, Cr及びCbのうち一つのみを処理します。従ってカラー画像を処理する場合は最低でも直流成分処理一回と交流成分は各データ一回づつの合計四回の処理を行なう必要があります。
  • 加えて、交流成分では、MCU単位ではなく単純に画像を分割した左上のブロックから右下のブロックへと順番に処理されて行きます。
  • また、交流成分では直流成分の処理が行なわれた範囲のみが処理可能となります。

プログレッシヴJPEGでの圧縮方法。

プログレッシヴJPEGでの圧縮方法は、DCT変換後の成分を量子化した後で上記の分割を行ないます。

分割後のデータに関して、処理を行なって行きます。

直流成分

直流成分は逐次近似を行なう場合に限り二回以上の処理が行なわれます。

一回目の逐次近似。

一回目(上位ビット)はベースライン方式JPEGと全く同じで、前のブロックの直流成分との差分を取った値をハフマン符号で表現します。

二回目以降の逐次近似。

二回目以降は1ビットづつ処理されるため、当該ビットそのものがそのままデータとなります。

  • 1ビットのデータなのでわざわざハフマン符号にさえしません。

交流成分

交流成分も逐次近似により処理が異なります。

一回目の逐次近似。

交流成分ベースライン方式JPEGと殆ど同じですが、データの形式が若干異なります。

具体的にはベースライン方式JPEGでのEOB符号の代りに、以下の符号が定義されております。

EOBn符号(n=0〜14)
EOBn符号とは、ゼロランレングスを拡張した符号です。

EOBn符号の直後にnビットのデータが続きます。

この後続データの値lとnから導き出された値をmとしたとき、現在処理中のブロックを含めたm個の後続ブロックをスキップします。

具体的には以下の関係になります。

  • m=2n+l

ですから、EOB0ではm=1となり、現在処理中のブロックの残りデータをスキップするだけ…つまり、ベースライン方式JPEGでのEOBと全く同じ事になります。

二回目以降の逐次近似。

二回目以降の逐次近似では常に1ビットのみの処理となります。

データ符号は常に1ビットですが、ZRL符号やEOBn符号があるため、やはりハフマン符号で表現されます。

また、符号の意味が一回目と異なっております。

具体的には、ベースライン方式JPEGや一回目の逐次近似での連続ゼロデータ数をあらわす符号はやはりゼロデータの個数を表しますが、このゼロデータは連続していなくても構わないとされております。

指定された個数のゼロデータをスキップするまでの間に現れる非ゼロデータには各々に1ビットの補正データが与えられ、そのビットが1の時にはビット補正が行なわれます。

また、EOBn符号は直後にnビットのデータが続き、この値lとnから導き出される値mとしたとき、現在処理中のブロックを含めたm個の後続ブロックに関して、非ゼロデータの補正処理のみを行なうものとします。

この補正には後続の1ビットデータが用いられます。

ですから、EOBn符号は以下のような構造になります。

  1. EOBn符号
  2. nビットのデータl
  3. 現在処理中のブロックを含めたmブロック(mはlとnから導き出される値)内の非ゼロデータの個数分の補正ビット