it.xnews.jp
生成: 2026-07-18 読了 約 3 分 model: claude-haiku-4-5 原文: https://maurycyz.com/projects/bad_jpeg/ raw.md

JPEGの段階的エンコーディングで複数画像を1ファイルに格納する技術

Maurycyzのブログが、JPEG形式のプログレッシブ機能を活用して単一ファイル内に複数画像やアニメーションを埋め込む方法を解説している。低周波成分を先に保存することで、部分的にダウンロードされた画像も低解像度で表示されるという特性を利用したもの。

Maurycyzのブログは2026年7月17日、JPEG形式の段階的スキャン機能を活用した多画像・アニメーション埋め込み技術について解説した。JPEG形式には低周波成分を先に保存する機能があり、部分的にダウンロードされた画像は途切れずに低解像度で表示される。この仕組みを応用することで、単一のJPEGファイルに複数の画像を格納できるという。

プログレッシブJPEGのスキャン構造

JPEG形式の圧縮データは複数の「スキャン」に分割され、各スキャンはFF DAというマーカーヘッダが付与される。スキャンには長さフィールド(ビッグエンディアン形式で00 0C)と処理対象チャンネル数(例:03)が含まれる。プログレッシブモードでは、1つのスキャンが直流成分(DC、ビン0)と交流成分(AC、ビン1以上)の両方を同時に含めることはできない制約がある。一方、ベースラインモードではこの制限がなく、デコーダは最初のスキャンの後で処理を停止する。

複数スキャンで構成されたプログレッシブJPEG

複数画像の連結とDC限定スキャン

複数のJPEG画像は、画像開始、フレーム開始、画像終了のマーカーを除去して連結することで、1ファイルに格納できる。最小限のプログレッシブJPEGは単一のDC限定スキャンで構成でき、この場合の解像度は16x16ブロック単位になるため元の解像度の1/16となる。DC限定フレームは規格に準拠した画像である。低速ネットワーク経由で配信される場合、連結されたJPEGファイルは複数画像の間を切り替えながら段階的に読み込まれる。

ただし、ほとんどのデコーダは一定のスキャン数に達するとそれ以上の処理を中止するとされており、「与えられた事実のみに基づいて自動生成されました」ではこれがzip爆弾型の問題回避と考えられている。デコーダがおおむね9フレーム程度で処理を放棄する一方、Chromeは90フレームまでレンダリング可能な報告があるなど、実装によって大きなばらつきがある。

DC限定画像の低解像度表示例

色空間と周波数成分の管理

JPEG形式ではRGBではなくYCbCr色空間を使用する。輝度(Y)チャンネルは高品質である必要があるのに対し、色差(Cb:B−G、Cr:R−G)は低品質でも許容される。さらに、色差データは解像度の半分で保存される(ピクセル数では4分の1)。この特性により、輝度情報を優先的に段階的にレンダリングしながら、色差情報は後から追加することが可能である。

この記事は元記事の事実のみに基づいて自動生成されました。

筆者の見立て

出典

Maurycyz ブログ「Regressive JPEGs: (Maurycy's blog)」 https://maurycyz.com/projects/bad_jpeg/

この記事をシェア