JPEGの段階的エンコーディングで複数画像を1ファイルに格納する技術
Maurycyzのブログが、JPEG形式のプログレッシブ機能を活用して単一ファイル内に複数画像やアニメーションを埋め込む方法を解説している。低周波成分を先に保存することで、部分的にダウンロードされた画像も低解像度で表示されるという特性を利用したもの。
Maurycyzのブログは2026年7月17日、JPEG形式の段階的スキャン機能を活用した多画像・アニメーション埋め込み技術について解説した。JPEG形式には低周波成分を先に保存する機能があり、部分的にダウンロードされた画像は途切れずに低解像度で表示される。この仕組みを応用することで、単一のJPEGファイルに複数の画像を格納できるという。
プログレッシブJPEGのスキャン構造
JPEG形式の圧縮データは複数の「スキャン」に分割され、各スキャンはFF DAというマーカーヘッダが付与される。スキャンには長さフィールド(ビッグエンディアン形式で00 0C)と処理対象チャンネル数(例:03)が含まれる。プログレッシブモードでは、1つのスキャンが直流成分(DC、ビン0)と交流成分(AC、ビン1以上)の両方を同時に含めることはできない制約がある。一方、ベースラインモードではこの制限がなく、デコーダは最初のスキャンの後で処理を停止する。

複数画像の連結とDC限定スキャン
複数のJPEG画像は、画像開始、フレーム開始、画像終了のマーカーを除去して連結することで、1ファイルに格納できる。最小限のプログレッシブJPEGは単一のDC限定スキャンで構成でき、この場合の解像度は16x16ブロック単位になるため元の解像度の1/16となる。DC限定フレームは規格に準拠した画像である。低速ネットワーク経由で配信される場合、連結されたJPEGファイルは複数画像の間を切り替えながら段階的に読み込まれる。
ただし、ほとんどのデコーダは一定のスキャン数に達するとそれ以上の処理を中止するとされており、「与えられた事実のみに基づいて自動生成されました」ではこれがzip爆弾型の問題回避と考えられている。デコーダがおおむね9フレーム程度で処理を放棄する一方、Chromeは90フレームまでレンダリング可能な報告があるなど、実装によって大きなばらつきがある。

色空間と周波数成分の管理
JPEG形式ではRGBではなくYCbCr色空間を使用する。輝度(Y)チャンネルは高品質である必要があるのに対し、色差(Cb:B−G、Cr:R−G)は低品質でも許容される。さらに、色差データは解像度の半分で保存される(ピクセル数では4分の1)。この特性により、輝度情報を優先的に段階的にレンダリングしながら、色差情報は後から追加することが可能である。
この記事は元記事の事実のみに基づいて自動生成されました。
筆者の見立て
- 複数フレーム対応がおおむね9フレームに制限されることは、適切なアニメーション実現には不十分と解釈している
- 適切なアニメーション実現には、各フレームのスキャン数を最小化することが必要になる可能性を示唆している
- DC限定プログレッシブJPEGは、型破りなrikrollおよびトローリング以外に実用的な応用がないと論じている
- 部分的レンダリングを使用することで多くの楽しみが得られると述べている
出典
Maurycyz ブログ「Regressive JPEGs: (Maurycy's blog)」 https://maurycyz.com/projects/bad_jpeg/