この画像を例として解析してみる。
JPEG ファイルの作成には ImageMagick を用いる。
ImageMagick は Independent JPEG Group のライブラリを用いている。
JPEG ファイルの作成においては quality を指定することができる。 これは量子化の過程に影響する。 実際にどのような影響があるのかを調べてみる。
まず、デフォルトの quality = 75 の場合。
od -c してみると次のように見える。
0000000 377 330 377 340 \0 020 J F I F \0 001 001 001 \0 H 0000020 \0 H \0 \0 377 341 1 253 E x i f \0 \0 I I
このように、 JFIF や Exif といった文字が見える。
Exif のところは拡張されたセグメントなのだろう。
この後にデジタルカメラの情報などが続いている。
この部分は od -Ax -tx1 で 16進数にすると次のように見える。
000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 000010 00 48 00 00 ff e1 31 ab 45 78 69 66 00 00 49 49
ff とその後 1バイトとでセグメントの始まりを表すマーカとなっている。 ff d8 は画像の開始を表し、 ff e0 はヘッダ情報を含むセグメントである。 多くのセグメントはマーカの後に 2バイト (ビッグエンディアン) で長さが来る。 Exif のセグメントは 31ab(H) (= 12715) バイト続くということなので、 その後を見てみる。 しかし、 12715 バイトも何が書かれているのかは謎だ。
0031c0 00 ff db 00 43 00 08 06 06 07 06 05 08 07 07 07 0031d0 09 09 08 0a 0c 14 0d 0c 0b 0b 0c 19 12 13 0f 14 0031e0 1d 1a 1f 1e 1d 1a 1c 1c 20 24 2e 27 20 22 2c 23 0031f0 1c 1c 28 37 29 2c 30 31 34 34 34 1f 27 39 3d 38 003200 32 3c 2e 33 34 32 ff db 00 43 01 09 09 09 0c 0b 003210 0c 18 0d 0d 18 32 21 1c 21 32 32 32 32 32 32 32 003220 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 * 003240 32 32 32 32 32 32 32 32 32 32 32 ff c0 00 11 08 003250 00 f0 01 40 03 01 11 00 02 11 01 03 11 01 ff c4
ff db で始まるのは量子化表である。2つある。輝度成分用と色差成分用である。 その後の ff c0 で始まるのはいよいよこれからデータが始まるということを 表すセグメントで、画像の大きさなどが書かれている。 解読すると次のようになる。
| 08 | 00 | f0 | 01 | 40 | 03 | 01 | 11 | 00 | 02 | 11 | 01 | 03 | 11 | 01 |
| 8 ビット | 240 行 | 320 列 | 3 要素 | 1 | (1, 1) | 0 | 2 | (1, 1) | 1 | 3 | (1, 1) | 1 | ||
| Y 成分 | Cb 成分 | Cr 成分 | ||||||||||||
このうち、各成分の 3バイト目は量子化表の識別子となっている。 Cb 成分と Cr 成分は同じ表を使い、 Y 成分は異るということがわかる。 2バイト目は水平・垂直方向のサンプリング比率である。 この場合はサブサンプリングは行わないということがわかる。
そこで、2つの量子化表を見てみる。 8×8 の 64 個の値を左上 (低周波成分) から右下 (高周波成分) へ ジグザグに辿った順に並べてある。 Perl スクリプトで一列に並んだものを表形式に戻す。 なお、スクリプトには 10進数に変換したものを入力する。
| 輝度量子化表 | 色差量子化表 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
このように、左上は小さく右下は大きい値になっている。 特に色差成分用は、半分以上が最大値になっている。
quality の値を変えてみて量子化因子がどうなるかを見てみる。 併せてファイルサイズも調べる。
| quality | 量子化因子 | ファイルサイズ | ||
|---|---|---|---|---|
| 輝度・直流 | 輝度・最小 | 色差・最大 | ||
| 0 | 255 | 255 | 255 | 14148 |
| 25 | 32 | 20 | 198 | 16649 |
| 50 | 16 | 10 | 99 | 18939 |
| 60 | 13 | 8 | 79 | 19969 |
| 75 | 8 | 5 | 50 | 22831 |
| 80 | 6 | 4 | 40 | 24827 |
| 85 | 5 | 3 | 30 | 27863 |
| 88 | 4 | 3 | 24 | 30758 |
| 90 | 3 | 2 | 20 | 33214 |
| 92 | 3 | 2 | 16 | 36106 |
| 94 | 2 | 1 | 12 | 41647 |
| 95 | 2 | 1 | 10 | 45273 |
| 96 | 1 | 1 | 8 | 51418 |
| 98 | 1 | 1 | 4 | 71444 |
| 99 | 1 | 1 | 2 | 93794 |
| 100 | 1 | 1 | 1 | 111579 |
これを見ると、 50 より上の quality では、 量子化因子はほぼ線形になっているようだ。 quality 100 では量子化因子は全て 1 で、これは量子化しないことを意味している。 逆に quality 0 では全て 255 になっていた。 ファイルサイズは quality が 95 を超えるくらいから急激に増えている。 なお、 ImageMagick では、 quality の値に小数点以下を指定しても 切り捨てられるようだ。
上に載せた画像は、結局 quality = 92 で作った。
000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 000010 00 48 00 00 ff db 00 43 00 01 01 01 01 01 01 01 000020 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 * 000050 01 01 01 01 01 01 01 01 01 ff db 00 43 01 01 01 000060 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 * 000090 01 01 01 01 01 01 01 01 01 01 01 01 01 01 ff c0 0000a0 00 11 08 00 08 00 08 03 01 11 00 02 11 01 03 11 0000b0 01 ff c4 00 14 00 01 00 00 00 00 00 00 00 00 00 0000c0 00 00 00 00 00 00 0a ff c4 00 1b 10 00 03 01 01 0000d0 00 03 00 00 00 00 00 00 00 00 00 00 04 05 06 03 0000e0 02 01 11 15 ff c4 00 15 01 01 01 00 00 00 00 00 0000f0 00 00 00 00 00 00 00 00 00 02 06 ff c4 00 1a 11 000100 00 03 01 01 01 01 00 00 00 00 00 00 00 00 00 00 000110 01 02 03 04 11 13 12 ff da 00 0c 03 01 00 02 11 000120 03 11 00 3f 00 29 b3 11 44 3e 48 ea 9f 43 d0 f4 000130 aa 71 80 43 3d 47 8d 64 b2 fb ce 02 65 97 a1 1f 000140 a5 8b a0 6a b9 c5 5c e0 2c 3b c8 07 8c 26 30 7a 000150 4a 5d f5 f3 f5 97 82 2e b8 31 ee 3b 2e 6c d4 ba 000160 0d 17 f1 cf 56 f2 7d 28 56 b6 5a 38 0a 96 a4 cf 000170 98 aa 29 25 99 01 46 60 9f 3f 40 12 42 c7 b2 0b 000180 59 26 f8 6a 7c e2 8d 4d 12 c6 89 3d 0d 25 9b 90 000190 99 69 72 f0 16 e8 45 2d 45 a4 ca 92 19 7b c6 1f 0001a0 ff d9 0001a2
| Y 成分 | Cb 成分 | Cr 成分 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
-690 -39 -53 8 30 -27 26 39 4 15 -30 2 -21 -35 16 -13 -9 29 -28 -6 44 -41 -16 60 -3 -13 18 -5 0 -1 -11 31 -26 -52 32 21 -17 24 43 -35 -14 16 3 -5 -15 28 16 -39 -7 29 9 -26 7 5 1 0 22 -16 -14 -10 5 -7 17 3 -49 -10 -9 -9 4 7 -3 -1 8 7 0 -6 -8 5 2 0 -5 3 9 -3 1 -2 5 6 -2 4 3 -1 -1 -2 -3 6 4 -4 1 0 -4 -1 5 -3 -2 1 1 1 2 2 -3 -1 1 -3 2 2 -1 -3 0 -2 0 2 -1 -1 1 1 1 -1 2 -12 12 -7 -2 5 -5 -3 15 -7 10 3 -8 -1 4 2 4 8 -5 -12 -3 -3 -4 8 2 -5 -2 -4 3 1 -1 -3 -10 4 7 1 3 -7 -1 6 0 1 -1 -3 -2 1 2 4 -2 4 -4 1 -2 1 1 -1 2 -2 0 1 0 -1 2 -1