JPEGセグメント BackIndexNext
ここではJPEGファイルの修復に必要な各セグメントの説明を行います。
JPEGファイルを修復される方はこのページの内容は重要ですので、必ず見て下さい。

JPEGファイル内のセグメントは、画像表示に直接関わっているものと、そうでないものがあり、JPEGファイルを修復する上で、それらを理解しておく必要があります。

普通のJPEGファイルに存在するセグメントの種類はそんなに多くありません。
ここでは、セグメントの種類をパターンとして覚えて下さい。


必須セグメント DQT,DHT,SOF,SOS

JPEGファイルには、以下の2種類のテーブルが含まれます。

 量子化テーブル  (Quantization Table)
 ハフマンテーブル (Huffman Table)

ハフマンテーブルの代りに、算術符号を用いた算術圧縮テーブル(Arithmetioc Coding Table)を使用する場合もありますが、
JPEGファイルは一般的にハフマン圧縮を利用し、算術圧縮はほとんど利用されていません。

原理的な説明は難しいので省略しますが、これら2種類のテーブルが無いと画像が表示されません。

実際のテーブルはDQT、DHTセグメントに記録されています。

DQT 量子化テーブル定義  (Define Quantization Table) 0xFFDB
DHT ハフマンテーブル定義 (Define Huffman Table)   0xFFD4

テーブルはDQTが、0〜3まで指定出来、DHTはDC成分とAC成分に分かれ、それぞれ0〜3まで指定出来ます。
後で説明するベースライン形式では、DHTは0、1しか指定出来ません。
また、ロスレス形式ではDHTのAC成分は指定出来ません。

DQTとDHTセグメントには複数のテーブルを記録できますので、実際は1つのセグメントにテーブルが3つ入っていたり、テーブルが1つづつ記録された同じ種類のセグメントが、複数存在したりします。


DQT連結対比

これらのテーブルは、別のセグメントで参照されますが、それぞれ、下記の様に対応しています。

SOF フレームヘッダー(Start of Frame) 0xFFC0〜0xFFCF ⇒ DQT 量子化テーブル定義
SOS スキャンヘッダー(Start of Scan) 0xFFDA      ⇒ DHT ハフマンテーブル定義

SOFはJPEGファイルの種類や主要な情報が記録されているセグメントで、いくつか種類があります。
その中で、通常使用されるのがSOF0(ベースライン形式)とSOF2(プログレッシブ形式)です。

上記4つのセグメントが、必ずJPEGファイルに存在する必須セグメントです。
これらが、欠落してしまうと画像が表示出来なくなるので、画像修復のポイントになります。


場合によって欠落すると表示できなくなるセグメント DRI

DRI リスタートインタバル定義(Define Restart Interval)  0xFFDD

伝送ミスやメディアの破損等により、画像データの一部が欠落やデータ化けを起こすと、通常それ以降の正常なデータも正しく表示出来なくなってしまいます。
画像データの部分的な破損が全体に波及するのを防ぐために、JPEGファイル作成時にリスタート処理を施す場合が有ります。

これらの処理が施されたJPEGファイルにはDRIが有り、画像データには、RSTマーカが周期的に複数記録されています。

よって、画像データにRSTマーカが有る物はDRIセグメントが必須セグメントとなります。
DRIが欠落すると、RSTマーカをイメージデータと間違い正常に表示出来ません。
JpegAnalyzer はRSTマーカが有るのにDRIマーカが欠落している、もしくはその逆だとエラーを表示します。
編集機能でDRIマーカが欠落した場合、他のセグメントの情報を元に、ファイルに挿入できる様にしてあります。
また、RSTマーカはビット化けに限り、変化ビット最小候補、特定ビットのマスクと2種類の方法で、検索、置換が出来ます。

※データが抜けている箇所には効果は有りません。
※リスタートインタバルについては後のページで詳しく説明しています。


無くても表示に影響の無いセグメント COM,APP他

COM(Comment)  0xFFFE

JPEGファイルに注釈文(ASCIIテキスト)を埋め込むためのセグメントで、無くても表示に影響しません。
一般には加工を行ったソフトの名前やバージョン、著作権情報(コピーライト)などが記録されています。
JpegAnalyzer では、COMセグメントを簡単に作成・削除できます。


APPn(Application Data)  0xFFE0〜0xFFEF nは0から15まで

これは、アプリケーション(JPEGファイルを作るソフトやハード)で自由に規定出来るセグメントです。
アプリケーション側で自由に規定出来るため、関連団体や企業等で独自にフォーマットを規定しており、全ては掌握出来ていません。
JpegAnalyzerに登録してあるものは解析リストに表示されるマーカ・セグメント情報で個別に説明しています。

通常は無くても表示出来なくなることはありませんし、多くのAPPセグメントはJPEGビュア上では読み飛ばしています。
ただし、以下の形式のAPPセグメントはJPEG画像の再生に利用したり、削除すると画像表示に影響が出たりしますので注意して下さい。

JPEGビュアで解読し画像表示に影響するAPPセグメント
APP0-JFIF

 各プラットフォーム(WindowsやUNIX系OS、Macintoshなど)と互換をとるデータが保存されています。
 このセグメントが書かれていることで、色空間はYCbCrまたはグレイスケールに指定されます。


APP14-Adobe

 アドビ社で規定したセグメントが有る場合、セグメント内のtransformフラグによって色空間が優先して指定されます。
 transform=2 YCCKの色空間を指定
 transform=1 YCbCrの色空間を指定
 transform=0 指定なし、コンポーネント数が3の場合RGB、4の場合CMYKと仮定する。


JPEGビュアで解読ししないが画像表示に影響するデータが格納されているAPPセグメント

APP1-Exif

 デジタルカメラで出力されるJPEG画像では、FlashPixと言う別の画像規格に合わせるため、パディングというダミーの画像データを画像の右端や下端に挿入している場合があります。
この場合、SOFセグメントにパディングを含めた画像サイズ、Exifセグメントにパディングを含まない画像サイズ(実効サイズ)を記録することになっており、画像再生時にパディング部分を隠すためトリミングして表示するように推奨されています。
 通常このパディングされた画像はあまり無いので、SOFセグメントの画像は実効サイズと同じですが、違う場合、Exifセグメントを削除すると実効サイズを失うことになります。
 あと、JFIF程明確に規定はされていませんが、Exif仕様の指定するセグメントで書かれていることで、色空間はYCbCr、ベースラインJPEGファイルに限定されます。


APP2-ICC Profile

 ICC PROFILEと言うAPP2のセグメントが有る場合、画像の色情報を補正するデータが記録されています。
 但し、プロフィルを適用して画像を見る為には対応したソフトや画像入出力機器用のプロフィルデータが必要になります。

注意事項

上記JPEGビュアで解読するしないは、IDG(Independent JPEG Group's)の配布しているリファレンスコードでの話です。
多くの画像ビュアは上記のコードを参考にされているとは思いますが、全てのビュアで上記の通りに処理している訳ではないのでご了承願います。

JPEGの基本セグメントでは色空間を指定出来ません。それらの情報はAPPセグメントに有る情報に依存しています。
APP0(JFIF)やAPP14(Adobe)等で指定されており、APPセグメント全てを削除するとJPEGビュアは色空間を仮定して表示させようとします。
YCbCrやグレイスケールなどの色空間を使っているファイルなら、通常のJPEGビュアでは正常に表示出来ると思いますが、他の色空間の場合正常に表示できなくなる可能性が有ります。

参照:表示色成分(色空間)について

スタッフィングバイト

セグメントの話では無いですが、関連した話なので、ここに記載します。

セグメント間にどこのセグメントにも属さない、無用なデータが記録される場合があります。
これをスタッフィングバイトと呼び、有ればエラーになったり、表示出来ない場合があります。

これらは、画像出力ソフトのバグや、データ破損などが考えられますが、中には位置合わせ目的で0xFFを詰めている場合も有ります。
JPEG規格では0xFFの連続は最後の0xFF以外無視するように規定されています。

読み取りソフトは、大抵は破損ファイルとして扱いますが、無視して次のマーカを読み取るソフトも存在します。
JPEGの規定内にスタッフィングバイトの可否まで明記されていないために、対応はソフトによってまちまちになっています。

Top