JPEG圧縮実験室

← トップへ
LOSSY IMAGE COMPRESSION

人の目が気づきにくい情報を減らす

JPEGは写真を小さくするための非可逆圧縮です。完全には元へ戻せませんが、明るさの細かな変化や色の細部を減らし、見た目をなるべく保ちながら容量を削ります。

● 選んだ画像はブラウザ内だけで処理
非可逆圧縮捨てた情報は展開しても戻りません。保存を繰り返すと劣化が重なる場合があります。
写真が得意色がなめらかに変化する写真に向きます。文字、線画、透過画像にはPNGなどが適する場合があります。
品質は割合ではない品質80は「元の80%」という意味ではありません。量子化の強さを決めるエンコーダー固有の指定です。

品質と容量を実際に比べる

サンプル画像または手元の画像をJPEGへ変換します。品質を下げ、細部・輪郭・色の境目を見比べてください。

変換前(ブラウザで展開した画素)

JPEGへ変換後

JPEG圧縮後のプレビュー
画像サイズ--
比較用の生RGB--
生成JPEG--
生RGBとの比較--

サンプル画像を準備しています。

JPEGができるまで

1. 色を分けるRGBを明るさYと色差Cb・Crへ変換します。
2. 色を間引く色差の画素数を減らすことがあります。人の目は明るさより色の細部に鈍感です。
3. 8×8に分割画像を小さなブロックへ分け、各ブロックを別々に処理します。
4. DCT・量子化模様の成分へ変換し、細かな成分を丸めて0を増やします。
5. 符号化0が続く部分などを短く表し、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で情報を実際に捨てる中心的な工程です。

ジグザグ走査・ランレングス・ハフマン符号とは?
  1. ジグザグ走査:量子化後の8×8表を、左上の粗い成分から右下の細かい成分へ斜め順に1列へ並べます。
  2. ランレングス:末尾に並びやすい0を「0が何個続く」とまとめます。
  3. ハフマン符号:よく現れる記号へ短いbit列を割り当てます。一般的なJPEGではこの方法を使います。

これらは情報を捨てずに短く表す工程です。量子化で0が増えているほど効きやすくなります。

なぜJPEGを保存し直すと劣化する?

JPEGを開くと、丸められた係数から画素を再構成します。それを再びJPEG保存すると、8×8への分割や量子化をもう一度行うため、さらに誤差が加わることがあります。編集途中はPNGなどの可逆形式や編集ソフト固有形式で保ち、最後に必要な品質でJPEGを書き出すと劣化を抑えられます。

実験結果について

生成JPEGはブラウザ内蔵エンコーダーによる実測です。品質値と色差間引きなどの内部設定はブラウザごとに異なる可能性があります。下のDCT・量子化表は仕組みを見せるため画像中央の輝度ブロックをこのページが計算したもので、生成JPEG内部の係数を解析したものではありません。「生RGB」は幅×高さ×3バイトの比較値で、元ファイルの容量ではありません。