ベースラインとプログレッシブ |
修復するために、まずは正常ファイルの解析例を確認しておいて下さい。
一般に存在するJPEGファイルはベースラインとプログレッシブの2つの形式に分かれます。
以下がその2つの形式を解析した結果です。
Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [0010] APP0 :JPEG File Interchange Format Ver 1.1 (JFIF)
density 240:240 dots/inch
00000014 [0084] DQT :Define Quantization Table
00000018 QT0-8bit CRC-00647E2F
00000059 QT1-8bit CRC-B5B2E384
0000009A [0011] SOF0 :Start Of Frame 0 - Baseline DCT
321[15] x 452[12] pixel - 24bit color (YCbCr 4:2:0)
ComponentID-01 Y 2x2 QT0
ComponentID-02 Cb 1x1 QT1
ComponentID-03 Cr 1x1 QT1
000000AD [01A2] DHT :Define Huffman Table
000000B1 HT0-DC 汎用輝度HT-DC
000000CE HT0-AC 汎用輝度HT-AC
00000181 HT1-DC 汎用色差HT-DC
0000019E HT1-AC 汎用色差HT-AC
00000251 [000C] SOS :Start Of Scan 0-63[00]
HT Selector[DC/AC] Y[0/0] Cb[1/1] Cr[1/1]
0000025F ****** Image Data ******
Data Size 25,670 bytes
000066A5 ****** EOI :End Of Image ******
← SOF0のJPEGファイルがベースライン形式
← 通常ベースラインはSOS+イメージデータは1つ
ベースラインは基本的なJPEG形式で、イメージデータを上から順に描画します。
SOF0が有るファイルがベースライン形式になります。
前ページで説明したテーブル用セグメントDQTとDHTがあり、
SOSセグメントが1つあります。
Address Length Message
00000000 ****** SOI :Start Of Image ******
00000002 [0010] APP0 :JPEG File Interchange Format Ver 1.1 (JFIF)
density 72:72 dots/inch
00000014 [0043] DQT :Define Quantization Table
00000018 QT0-8bit IJG輝度 画質93
00000059 [0043] DQT :Define Quantization Table
0000005D QT1-8bit IJG色差 画質93
0000009E [0011] SOF2 :Start Of Frame 2 - Progressive DCT
768[0] x 1024[0] pixel - 24bit color (YCbCr 4:2:0)
ComponentID-01 Y 2x2 QT0
ComponentID-02 Cb 1x1 QT1
ComponentID-03 Cr 1x1 QT1
000000B1 [001D] DHT :Define Huffman Table
000000B5 HT0-DC CRC-DB270E75
000000D0 [001B] DHT :Define Huffman Table
000000D4 HT1-DC CRC-B7F83BFF
000000ED [000C] SOS :Start Of Scan 0-0[01]
HT Selector[DC/AC] Y[0/-] Cb[1/-] Cr[1/-]
000000FB ****** Image Data ******
Data Size 11,369 bytes
00002D64 [0038] DHT :Define Huffman Table
00002D68 HT0-AC CRC-30CF4AD0
00002D9E [0008] SOS :Start Of Scan 1-5[02]
HT Selector[DC/AC] Y[-/0]
00002DA8 ****** Image Data ******
Data Size 13,521 bytes
00006279 [0030] DHT :Define Huffman Table
0000627D HT1-AC CRC-C2961820
000062AB [0008] SOS :Start Of Scan 1-63[01]
HT Selector[DC/AC] Cr[-/1]
000062B5 ****** Image Data ******
Data Size 2,303 bytes
00006BB4 [0030] DHT :Define Huffman Table
00006BB8 HT1-AC CRC-978A2CF5
00006BE6 [0008] SOS :Start Of Scan 1-63[01]
HT Selector[DC/AC] Cb[-/1]
00006BF0 ****** Image Data ******
Data Size 2,842 bytes
0000770A [0046] DHT :Define Huffman Table
0000770E HT0-AC CRC-27563850
00007752 [0008] SOS :Start Of Scan 6-63[02]
HT Selector[DC/AC] Y[-/0]
0000775C ****** Image Data ******
Data Size 13,226 bytes
0000AB06 [0028] DHT :Define Huffman Table
0000AB0A HT0-AC CRC-A172C354
0000AB30 [0008] SOS :Start Of Scan 1-63[21]
HT Selector[DC/AC] Y[-/0]
0000AB3A ****** Image Data ******
Data Size 25,429 bytes
00010E8F [000C] SOS :Start Of Scan 0-0[10]
HT Selector[DC/AC] Y[0/-] Cb[0/-] Cr[0/-]
00010E9D ****** Image Data ******
Data Size 2,304 bytes
0001179D [0029] DHT :Define Huffman Table
000117A1 HT1-AC CRC-5767DFB6
000117C8 [0008] SOS :Start Of Scan 1-63[10]
HT Selector[DC/AC] Cr[-/1]
000117D2 ****** Image Data ******
Data Size 3,230 bytes
00012470 [0029] DHT :Define Huffman Table
00012474 HT1-AC CRC-63F2DEDB
0001249B [0008] SOS :Start Of Scan 1-63[10]
HT Selector[DC/AC] Cb[-/1]
000124A5 ****** Image Data ******
Data Size 4,095 bytes
000134A4 [0027] DHT :Define Huffman Table
000134A8 HT0-AC CRC-6AA1C04E
000134CD [0008] SOS :Start Of Scan 1-63[10]
HT Selector[DC/AC] Y[-/0]
000134D7 ****** Image Data ******
Data Size 43,808 bytes
0001DFF7 ****** EOI :End Of Image ******
←SOF2がプログレッシブ形式
←プログレッシブ形式のDHTは
HT0〜HT1だけを使い分散して書かれる場合もあるが、
HT0〜HT3を使って一箇所に書かれる場合もある
← プログレッシブ形式の画像データは分割され記録される
Y+Cb+Crの量子化係数0の下位1bitデータ(スキャン1回目)
Yの量子化係数1〜5の下位2bitデータ(スキャン1回目)
Crの量子化係数1〜63の下位1bitデータ(スキャン1回目)
Cbの量子化係数1〜63の下位1bitデータ(スキャン1回目)
Yの量子化係数6〜63の下位2bitデータ(スキャン1回目)
Yの量子化係数1〜63の1bitデータ(スキャン2回目)
Y+Cb+Crの量子化係数0の残りのbitデータ(スキャン2回目)
Crの量子化係数1〜63の残りのbitデータ(スキャン2回目)
Cbの量子化係数1〜63の残りのbitデータ(スキャン2回目)
Yの量子化係数1〜63の残りのbitデータ(スキャン3回目)
SOF2が有るファイルがプログレッシブ形式になります。
ベースラインと違いは、SOS+イメージデータが複数に分けて、分割して記録されます。
上の例では、画像成分(Y,Cb,Cr)、量子化係数、ビット単位で分割されて記録されています。
プログレッシブは回線が低速な時代に 回線負荷の大きい画像ファイルを送る為改良された形式で、画質の荒いイメージを最初に表示し、順次画質を上げ、ファイル転送途中から画像を表示出来る方式です。
プログレッシブ形式のJPEGファイルをお持ちでしたら、SOIから最初のイメージデータまで選択し、領域画像表示(編集メニューまたは解析リスト上で右クリック)、次はSOIから2つ目のイメージデータまで…と、範囲を広げて表示していけば、どのように表示されるかがプレビュー画面で確認できます。
この2つが基本形ですので、修復にはこれらとの違いを見つける事により、問題点が見つかるようになると思います。
プログレッシブの分割方式 プログレッシブには3つの分割方式があります。上の解析例は3つ目の複合方式です。
スペクトラル・セレクション 周波数成分ごとに分割(量子化係数単位)
サクセッシブ・アプロキシメーション AC成分の係数データをビットごとに分割
上記2方式を複合した方式
プログレッシブで画像が縮む理由 一般にベースライン方式に比べ、プログレッシブ方式は画像サイズが小さくなる(縮む)と言われています。
ハフマンテーブルやイメージデータの個数は増えてしまうのにどうして小さくなるのでしょうか?
答えはハフマン圧縮の方法にあります。
プログレッシブ方式は、量子化係数やデータビット単位で0の発生頻度の高いデータをまとめることにより、量子化を行うのと同じ理由でデータの圧縮効率が高まります。
例えば、AC成分が全て0の画像が有るとします。
ベースラインではEOB(End Of Block)を使い、一つのハフマンコードでブロックデータを表します。
EOB(End Of Block)最大変換ビット数=63(1ブロックのAC成分)x8ビット=504ビット
プログレッシブではEOB(End Of Band)を使い、一つのハフマンコードで1回分のスキャンデータを表します。
EOB(End Of Band)最大変換ビット数=画像内ブロック数xスキャン係数xスキャンビット数
640x480(4:2:0)の画像の場合、7200ブロック有るので1係数、1ビットだけでも7200ビット
EOBで省略出来る最大データ数はベースラインと比べ、画像の面積に比例して多くなり、効率的になります。
結果、ハフマンテーブルやSOSなどJPEGを構成するセグメントデータは増えてしまうが、圧縮効率が良くなり、それを上回る以上に画像データが減ると言う訳です。
画像によって圧縮効率は変わるので、どこからとは言えませんが、小さい面積の画像はプログレッシブにすると逆にサイズは大きくなります。
全てに於いてプログレッシブにするとファイルサイズが軽減される訳ではないので誤解の無いように。