本文へスキップ
AZ Tools

JPEG構造インスペクター

デコーダーと同じようにSOIからEOIまでマーカーを順にたどり、各セグメントが何で、どこから始まり何バイト使っているかを示します。フレームヘッダー(SOFn)からは画像サイズ、サンプル精度、成分数、サンプリング係数が読め、そのマーカー番号がベースラインかプログレッシブかを決めます。ブラウザはベースラインを上から一行ずつ、プログレッシブを全体がだんだん鮮明になる形で表示するため、画素を見ても分からない違いです。サンプリング係数は4:4:4・4:2:2・4:2:0という表記に変換し、元の数値も併記します。写真が甘く見える原因が品質設定ではなく、半分の解像度で保存された色情報だと分かることがあります。量子化テーブルは規格の附属書Kの例示テーブルと比較し、libjpegが倍率を掛けただけのものであればその倍率を逆算して実際の品質値を復元します。そうでなければ平均による推定値として表示します。MozJPEGやPhotoshop、カメラのファームウェアは独自のテーブルを使うためです。アプリケーションセグメントはサイズ付きで一覧になり、ファイルが大きい理由はたいていここにあります。複数のAPP2に分割されたICCプロファイル、サムネイル入りのEXIF、編集ソフトが残したXMP、PhotoshopのAPP13リソースが、それぞれ何バイトでファイルの何パーセントかが分かります。EXIFは有無とサイズのみを報告し、タグの中身はこのサイトのEXIFビューアーで読んでください。符号化の項目にはリスタート間隔、ハフマンテーブル数、スキャン数、そして再圧縮で実際に縮むエントロピー符号化データの割合が並びます。最後に、ファイルが本当にEOIで終わっているか、その後に何バイト続いているかを示します。デコーダーは末尾の余分なデータを無視するため、これがJPEGポリグロットの作られ方です。画素のデコードや画質の判定は行わず、スキャンの途中で切れたファイルは中途半端に読まずに拒否します。切れた地点より先の数値は信用できないからです。

使い方

  1. JPEGをボックスにドロップするか、クリックして選びます。アップロードはせず、ページ内でバイトを読みます。
  2. まず概要を見ます。画像サイズ、ベースラインかプログレッシブか、色差の間引き、推定品質が並びます。
  3. ファイルが想定より大きいときはアプリケーションセグメントの表を確認します。小さな画像ではICCプロファイルやEXIFのサムネイルが絵より重いこともあります。
  4. 量子化テーブルを開いて実際の行列と、それが標準の附属書Kのテーブルかエンコーダー独自のものかを確かめます。
  5. マーカー一覧で異常を探します。JFIFヘッダーの欠落、見慣れないAPPn、EOIの後に残ったバイトなどです。

よくある質問

ベースラインかプログレッシブかはどう判定していますか。違いは重要ですか。
1バイトで決まります。ベースラインはSOF0、プログレッシブはSOF2のフレームヘッダーを持ち、このツールは絵から推測せずマーカーそのものを読みます。違いは読み込み中の見え方です。ベースラインは1回のスキャンで上から下へ埋まっていき、プログレッシブは複数のスキャンが全体を精細にしていくため、数キロバイト受け取っただけでぼやけた全体像が現れます。プログレッシブは数パーセント小さくなることが多い一方、デコードにCPUとメモリを多く使うので、ごく小さな画像やサムネイルはベースラインのままにする運用もよくあります。
なぜ品質は推定値なのですか。
JPEGファイルは品質の数値を保存しません。保存されるのは量子化テーブルで、エンコーダーの品質スライダーはそのテーブルを作る規則にすぎません。libjpegは附属書Kの例示テーブルにスライダーから求めた倍率を掛けるだけなので逆算でき、テーブルが倍率を掛けた附属書Kのテーブルと完全に一致する場合は、実際にlibjpegへ渡された値を復元して表示します。一方、Photoshop、MozJPEG、カメラのファームウェアは独自のテーブルや独自の倍率を使うため、平均による推定にとどまります。再保存すると対応関係が壊れることにも注意してください。品質90で作った画像を95で保存し直すと、テーブルは95、実際の情報量は90のままです。
品質を上げても写真が甘く見えます。どこを見ればよいですか。
品質とは別の設定である色差の間引きを見てください。4:2:0では2つの色差チャンネルが幅・高さとも半分の解像度で保存されるため、青地の赤い線、色付きの文字、彩度の高いロゴの縁は4分の1の色サンプルから復元され、品質設定にかかわらずにじんで見えます。このツールはフレームヘッダーのサンプリング係数から判定し、元の数値も併記します。輝度2×2に色差1×1なら4:2:0、輝度2×1なら4:2:2、すべて1×1なら4:4:4です。多くのエンコーダーは品質90前後から自動的に4:4:4へ切り替えるため、95で書き出した画像が量子化の差だけでは説明できないほど鮮明に見えることがあります。
絵の割にファイルが大きすぎます。バイトはどこへ行ったのですか。
アプリケーションセグメントの合計を見てください。よくある原因はICCプロファイルです。v4のプロファイルは数十キロバイトになり、JPEGのセグメントは1つ65,533バイトまでしか入らないため複数のAPP2に分割されます。このツールはその個数を数えます。EXIFにはサムネイルが埋め込まれていることが多く、編集ソフトのXMPは数キロバイトのXML、PhotoshopのAPP13にはウェブでは使わないパスやスライスが残ります。エントロピー符号化データの割合が残り半分の答えです。スキャンデータがファイルの40%しかないなら、再圧縮しても効果は薄く、メタデータを削るほうが効きます。
リスタート間隔とは何で、何の役に立つのですか。
DRIセグメントがリスタート間隔を指定すると、エンコーダーはMCU N個ごとにRSTマーカーを書き、そこでエントロピー符号化の状態をリセットします。サイズはわずかに増えますが、得られるものが2つあります。バイトが壊れてもデコーダーがその地点で同期を取り直せること、そしてリスタートの間を並列にデコードできることです。ウェブ用のJPEGには通常なく、スキャナーや放送機器、ハードウェアデコーダー向けのファイルで見かけます。設定されている場合はMCU単位の間隔を表示し、RSTマーカー自体はスキャンの一部として読み飛ばし、セグメント一覧には載せません。
ビューアーでは普通に開けるファイルが、なぜ拒否されるのですか。
ビューアーは寛容でよくても、構造の報告はそうはいかないからです。EOIマーカーがないまま終わっているファイルは圧縮データの途中で切れており、デコーダーは読めた行数だけ表示しますが、マーカーの連鎖には終わりがありません。その状態で合計を出しても断片の合計にしかなりません。セグメントがファイル末尾を超える長さを宣言している場合も同じで、その先は読めず、手前だけを無傷のように報告するのは何も言わないより悪いことです。どちらも名前の付いたエラーとして扱い、SOIマーカーで始まらないファイルも同様です。PNGを.jpgに改名したものが典型例です。

関連ツール