画像の破損
PNG・JPEG・GIF を同じ操作で壊して崩れ方を比べます。
見本
壊す
場所
操作
数
PNG
崩れ —
圧縮
フィルタ
JPEG
崩れ —
RST の間隔
GIF
崩れ —
インターレース
動作原理と式
崩れ方の違い
| 形式 | 変わるもの | 広がる範囲 | 戻る所 |
|---|---|---|---|
| PNG | Deflate の符号の切れ目 | 残り全部 | なし |
| PNG(圧縮なし) | フィルタの基準の画素 | Sub は右、Up は下、Average と Paeth は右下へ | None の行 |
| JPEG | DC の差分・符号の切れ目 | 同じ成分の残り全部 | RST |
| GIF | 辞書の項目 | 次の Clear まで。長さが変わると位置のずれは残る | Clear(色だけ) |
PNG
Deflate はハフマン符号を切れ目なく並べるので、符号のビットが変わると以降の切れ目がずれます[2]。距離や付加ビットだけが変わった場合は切れ目が保たれ、崩れは一部で済みます。圧縮なしでは 1 バイトがそのまま 1 標本になり、フィルタの差分で崩れがそのバイトから広がります[1][5]。幅を変えると行の先頭のフィルタ番号の位置もずれるので、フィルタを使う画像は砂嵐になり、None だけの画像は斜めの絵になります。
3 形式のうち検査値があるのは PNG だけです。チャンクごとの CRC-32 と zlib の Adler-32 です[1]。合わないファイルを開かないブラウザもあります。
JPEG
DC 係数は前のブロックとの差で符号化するので、差が変わると同じ成分の以降のブロックの明るさや色がずれ続けます[3]。ハフマン符号の切れ目がずれてもやがて合い直しますが、読んだブロックの数が変わった分だけ絵が横にずれます。付加ビットだけが変わると 1 ブロックで済むので、崩れは残り全部かほぼ 0 に分かれます。
RST は符号の切れ目と DC の予測を戻すマーカーです[3]。間隔を短くすると崩れはその間隔の中で止まり、ファイルは大きくなります。
GIF
LZW の符号の幅は辞書の項目の数で決まるので、値が変わっても切れ目はずれません[4]。変わるのはその符号の列と、それを元に足した辞書の項目です。この項目は次の Clear で消えます。列の長さが変わると以降の画素の位置がずれ、Clear の後もずれたままです。
サブブロックの長さのバイトを壊すと、データと長さの境が変わり、符号の切れ目もずれます。
出典
- フィルタ(9 章)・CRC-32(5.5)W3C, Portable Network Graphics (PNG) Specification (Third Edition), W3C Recommendation, 2025-06-24
- Deflate のハフマン符号と距離P. Deutsch, RFC 1951: DEFLATE Compressed Data Format Specification version 1.3, 1996
- DC の差分(F.1.2)・リスタートマーカー(Annex B)。崩れ方そのものはこのツールでの測定ITU-T Recommendation T.81 | ISO/IEC 10918-1, Digital compression and coding of continuous-tone still images – Requirements and guidelines, 1992
- LZW の可変長符号(付録 F)・サブブロックCompuServe, Graphics Interchange Format, Version 89a, 1990
- PNG のフィルタごとの崩れ方UCNV, The Art of PNG Glitch, 2015
- 読めない符号を 0 として続けるlibjpeg-turbo, jdhuff.c の jpeg_huff_decode
このツールで決めたこと
- 崩れ: 元の復号と色の差が 16 以上の画素と、読めなかった画素の割合
- 読めなかった画素: 市松模様
- PNG の検査値: 不一致でも読み続ける
- PNG の 5 以上のフィルタ番号: None として読む
- PNG の Deflate: 読めなくなった所で止まる
- JPEG の読めない符号: 0 として読む[6]
- JPEG の 63 を超える係数: 捨てる
- JPEG のスキャンの中の余分なマーカー: 読み飛ばす
- JPEG のデータが尽きたあとのブロック: 読まない
- GIF の辞書にない符号: KwKwK として読む
- GIF の途中の EOI: 読み飛ばす
- GIF の区画の先頭でないバイト: 次の区画まで読み飛ばす
- 符号化: PNG は RGB、JPEG は品質 75・4:2:0・標準のハフマン表、GIF は 256 色で誤差拡散なし
- 8 か所と 64 か所: データでは位置の後ろ 5 % の幅に、ほかの場所では範囲の中に散らす
- ファイル: 長い辺を 640 画素までに縮め、透明な所を白で塗って 3 形式に符号化
- 大きさの上限: 4,194,304 画素