JPEG圧縮実験室
← トップへ人の目が気づきにくい情報を減らす
JPEGは写真を小さくするための非可逆圧縮です。完全には元へ戻せませんが、明るさの細かな変化や色の細部を減らし、見た目をなるべく保ちながら容量を削ります。
● 選んだ画像はブラウザ内だけで処理品質と容量を実際に比べる
サンプル画像または手元の画像をJPEGへ変換します。品質を下げ、細部・輪郭・色の境目を見比べてください。
変換前(ブラウザで展開した画素)
JPEGへ変換後
サンプル画像を準備しています。
JPEGができるまで
8×8画素をDCTする
画像中央の8×8画素から明るさを取り出し、DCTで「どんな模様がどれだけ含まれるか」へ実変換した値です。
左上はブロック全体の平均的な明るさ。右・下へ行くほど細かく変化する高周波成分です。
量子化して丸める
DCT係数を品質に応じた数で割って整数へ丸めます。0になった成分は捨てられ、元どおりには戻せません。
専門用語を順番に理解する
YCbCrと色差間引きとは?
画面は通常、赤・緑・青のRGBで色を表します。JPEGはこれを、明るさのY、青みの差Cb、赤みの差Crへ分けます。人の目は細かな明暗には敏感ですが、細かな色の違いには比較的鈍いため、Cb・Crの解像度を縦横半分にする「4:2:0」などが使われます。4画素で色差を共有するイメージです。ただし実際の方式はエンコーダー設定で異なります。
DCT(離散コサイン変換)とは?
8×8画素の値を、64種類の波模様の組み合わせへ言い換える計算です。画素を消す処理ではなく、同じ情報を別の座標で表す変換なので、DCTだけなら逆変換で元へ戻せます。写真の小領域はなだらかなことが多く、左上付近の粗い模様へ値が集中し、右下側の細かな模様は小さくなる傾向があります。
量子化とは?
DCT係数を「量子化表」の数で割り、四捨五入する処理です。例えば係数12を20で割ると1、係数3なら0になります。細かな模様ほど大きな数で割るため、多くが0になります。品質を下げるほど強く丸められ、容量は減りますが、細部の消失や8×8境界のブロックノイズが見えやすくなります。JPEGで情報を実際に捨てる中心的な工程です。
ジグザグ走査・ランレングス・ハフマン符号とは?
- ジグザグ走査:量子化後の8×8表を、左上の粗い成分から右下の細かい成分へ斜め順に1列へ並べます。
- ランレングス:末尾に並びやすい0を「0が何個続く」とまとめます。
- ハフマン符号:よく現れる記号へ短いbit列を割り当てます。一般的なJPEGではこの方法を使います。
これらは情報を捨てずに短く表す工程です。量子化で0が増えているほど効きやすくなります。
なぜJPEGを保存し直すと劣化する?
JPEGを開くと、丸められた係数から画素を再構成します。それを再びJPEG保存すると、8×8への分割や量子化をもう一度行うため、さらに誤差が加わることがあります。編集途中はPNGなどの可逆形式や編集ソフト固有形式で保ち、最後に必要な品質でJPEGを書き出すと劣化を抑えられます。