JPEGファイルとは何ですか?
JPEG は、非可逆圧縮方式を使用して保存される画像形式の一種です。圧縮の結果としての出力イメージは、ストレージ サイズとイメージ品質の間のトレードオフです。ユーザーは圧縮レベルを調整して、必要な品質レベルを達成すると同時に、ストレージ サイズを縮小できます。画像に 10:1 圧縮を適用しても、画質への影響はほとんどありません。圧縮値が高いほど、画質の劣化が大きくなります。
ファイル形式の仕様
JPEG 画像ファイル形式は、Joint Photographic Experts Group によって標準化されたため、JPEG という名前が付けられました。この形式は、ウェブ上で写真画像を保存および送信する際に選択されてきました。現在、ほぼすべてのオペレーティング システムに、JPEG 画像の視覚化をサポートするビューアが搭載されています。これらの画像は、多くの場合、JPG 拡張子で保存されることもあります。 Web ブラウザーでさえ、JPEG 画像の視覚化をサポートしています。 JPEG ファイル形式の仕様に入る前に、JPEG 作成に含まれるステップの全体的なプロセスについて言及する必要があります。
JPEG 圧縮手順
変換: カラー画像は RGB から輝度/クロミナンス画像に変換されます (目はクロミナンスではなく輝度に敏感であるため、クロミナンス部分は多くのデータを失う可能性があり、高度に圧縮される可能性があります。
ダウン サンプリング: ダウン サンプリングは、輝度成分ではなく色成分に対して行われます。ダウン サンプリングは、水平方向 2:1、垂直方向 1:1 (2h 1 V) の比率で行われます。したがって、「y」コンポーネントに触れないため、画像のサイズが縮小され、画質が著しく低下することはありません。
グループ化: 行数または列数が 8 の倍数でない場合、各色成分のピクセルは「データ ユニット」と呼ばれる 8×2 ピクセルのグループに編成され、一番下の行と一番右の列が複製されます。
離散コサイン変換: 次に、離散コサイン変換 ( DCT) が各データ ユニットに適用され、変換されたコンポーネントの 8 × 8 マップが作成されます。これは、マップがなくても画質がいくらか低下することを意味しますが、通常は小さいです。
量子化: データ ユニット内の変換された 64 個のコンポーネントのそれぞれは、「量子化係数 (QC)」と呼ばれる個別の数値で除算され、整数に丸められます。これは、情報が取り返しのつかないほど失われる場所であり、大規模な QC はより多くの損失を引き起こします。一般に、ほとんどの JPEG 実装では、JPEG 標準で推奨されている QC テーブルを使用できます。
エンコーディング: 各データ ユニットの 64 個の量子化変換係数 (現在は整数) は、RLE とハフマン コーディングの組み合わせを使用してエンコードされます。
ヘッダーの追加: 最後のステップでは、ヘッダーと使用されるすべての JPEG パラメータを追加し、結果を出力します。
JPEG デコーダは逆の手順を使用して、圧縮されたイメージから元のイメージを生成します。
ファイル構造
JPEG 画像は、各セグメントがマーカーで始まる一連のセグメントとして表されます。各マーカーは 0xFF バイトで始まり、その後にマーカーの種類を表すマーカー フラグが続きます。マーカーが続くペイロードは、マーカーの種類によって異なります。一般的な JPEG マーカーの種類は次のとおりです。
短い名前 | バイト | ペイロード | 名前 | コメント |
---|---|---|---|---|
SOI | 0xFF, 0xD8 | なし | 画像の開始 | |
S0F0 | 0xFF, 0xC0 | 可変サイズ | フレームの開始 | |
S0F2 | 0xFF, 0xC2 | 可変サイズ | フレームの開始 | |
DHT | 0xFF, 0xC4 | 可変サイズ | ハフマン テーブルの定義 | |
DQT | 0xFF, 0xDB | 変数サイズ | 量子化テーブルの定義 | |
DRI | 0xFF、0xDD | 4 バイト | 再起動間隔の定義 | |
SOS | 0xFF、0xDA | 可変サイズ | スキャン開始 | |
RSTn | 0xFF, 0xD//n//(//n//#0..7) | なし | 再起動 | |
APPn | 0xFF, 0xE//n// | 可変サイズ | アプリケーション固有 | |
COM | 0xFF, 0xFE | 可変サイズ | コメント | |
EOI | 0xFF, 0xD9 | なし | 画像の終わり |
エントロピー符号化されたデータ内で、任意の 0xFF バイトの後、0x00 バイトがエンコーダーによって次のバイトの前に挿入されるため、意図されていない場所にマーカーがないように見え、フレーミング エラーが防止されます。デコーダは、この 0x00 バイトをスキップする必要があります。 バイト スタッフィング (JPEG 仕様セクション F.1.2.3 を参照) と呼ばれるこの手法は、マーカー ペイロード データではなく、エントロピー符号化データにのみ適用されます。 .ただし、エントロピー符号化されたデータには独自のマーカーがいくつかあることに注意してください。特にリセット マーカー (0xD0 ~ 0xD7) は、エントロピー符号化されたデータの独立したチャンクを分離して並列デコードを可能にするために使用され、エンコーダーはこれらのリセット マーカーを一定の間隔で自由に挿入できます (ただし、すべてのエンコーダーがこれを行うわけではありません)。