画像を書き出すとき、あのJPEG品質スライダーを、あなたはずっと百分率として使っていないだろうか。80に合わせて「画質の8割は保てた」と思い、100にすれば「これで何も失っていない」と感じる。
この理解は根本から覆さなければならない。スライダー上の数字は「画質を百分率で表した値」ではまったくないし、品質100も可逆ではない。先にすぐ使える結論を置いておく——写真を安心して保存したいなら85–92。WebやSNSに出すなら75–82で十分。100をデフォルトにしてはいけない。85と比べれば、ファイルサイズが2.5倍、ひどければ4倍になるだけで、画質は少しも良くならない。以下では、このスライダーをかみ砕いて説明する。
一言で言えば、JPEGの品質スライダーが制御しているのは「画質をどれだけ残すか」ではなく、量子化テーブル(Quantization Table)の中の除数をどれだけ大きくするかだ。除数が大きいほど、丸めが粗くなり、失われる情報が増える。画質ともファイルサイズとも線形関係ではなく、100から90への変化と、20から10への変化は同じではない。
まず前提を置く。JPEGは非可逆圧縮形式であり、保存ボタンを押した瞬間からすでに何かを失っている。スライダーが決めるのは「どれだけ荒っぽく捨てるか」だけで、「捨てるか捨てないか」ではない。捨て方には決まった流れがあり、スライダーはそのラインの最後のゲートだ。
保存時、画像はまずRGBからYCbCrへ変換され、明るさと色が二つの経路に分けられる。こうするのは、人間の目が色より明るさにずっと敏感だからだ。先に分けておけば、後で明るさを重点的に守りやすい。
次に、画像全体が8×8ピクセルの小さなブロックに切られ、各ブロックに離散コサイン変換(DCT)が施され、ピクセルの色が周波数の並びに変換される。和音を単音に分解するようなものだ。低周波は画面の下地やグラデーション、高周波は鋭いエッジや細かいテクスチャにあたる。この流れの完全版は、WikipediaのJPEG項目に詳しく書かれている。
本当の決め手は最後の工程だ。各周波数値を量子化テーブル内の数値で割り、四捨五入して整数化する。丸めこそ、情報が永久に死ぬ場所だ。割り切れない端数はそのまま捨てられ、戻ってこない。品質スライダーが決めているのは、この除数をどれだけ大きくするかだ。スライダー値が高いと除数は小さくなり、丸めでほとんどデータを傷めない。スライダー値が低いと除数が大きくなり、丸めが細部を平らに潰す。しかも高周波成分の除数はより速く大きくなるため、毎回先に犠牲になるのはエッジと細かいテクスチャだ。
だからこそ、これは百分率にはならない。100から90へ下げるのと、20から10へ下げるのでは、除数の変化はまったく別物であり、画質とファイルサイズの落差もまったく違う。90付近で1目盛り動かしても気づかないかもしれないが、20付近で1目盛り動かすと画像は壊れる。これを百分率として理解するのが、このスライダーに関する最もよくある、そして最も高くつく誤解だ。
先に答えを言う。100を可逆から隔てる致命的な欠陥は二つある。一つはスライダーとは無関係に起こり、もう一つはスライダーでも救えない。
第一はクロマサブサンプリング(chroma subsampling)だ。RGBからYCbCrへ変換した後、圧縮が本格的に始まる前に、ほとんどのエンコーダーが、まず約75%の色差情報を捨てる。理由はやはり同じで、人間の目は色に鈍く、捨ててもわからないからだ。この工程はそもそもスライダーの管轄外であり、100に設定しても変わらず実行される。
第二は数学そのものが完全ではないことだ。量子化テーブルの除数を最小にしても、「ピクセルから周波数へ、周波数からピクセルへ戻す」という往復の間に、小さな丸め誤差が残る。保存されたファイルを開いても、保存ボタンを押したときのピクセルではない。
本当に1ビットも失いたくないなら、可逆ルートへ進もう。PNG、TIFF、またはWebPの可逆モードだ。非可逆圧縮は一方通行であり、JPEGのどの設定でも同じだ。あの「完璧」に見える100も例外ではない。
大量の実測とピクセル単位の比較は、最終的に非常に明確な境界に落ち着く。二つのレンジで、ほぼすべての場面をカバーできる。
85–92は保存用だ。ポートフォリオ、クライアントに納品する写真、手を入れたくない元画像はこのレンジに置く。品質90で保存したファイルは、非圧縮の約1/8から1/12であり、しかも違いは肉眼では見えない。400%に拡大して、ある小さな部分をじっと見て、ようやく変化を見つけられる程度だ。
75–82はWeb用だ。サイトの挿絵、SNS投稿はこのレンジに置く。ファイルは保存用よりさらに40%–60%小さく、代償は主に複雑なテクスチャが少し柔らかくなることだが、普通に見る分にはほとんど気づかない。
前回の『非可逆と可逆』を読んでいれば、そこで示した80–85のスイートスポットはこの二つと矛盾しない。80前後はもともとWeb用に入り、85はちょうど保存用に踏み込む。すでに80–85で保存した画像を、わざわざ圧縮し直す必要はない。
三つを一言にまとめると、残すものは85–92、送り出すものは75–82、60以下は地雷原、避けろ。
書き出しのデフォルトを100にするのは、不安であって戦略ではない。品質85のファイルのサイズは、品質100の25%–40%に収まる。画質にはまったく差が見えない。Webにとっては、ただ読み込み時間を長くしているだけだ。サイト画像のこの収支については、Web画像高速化の記事で詳しく計算した。
スライダーが60を下回ると、画質は坂ではなく崖のように落ちる。
原因はやはり丸めだ。値が低すぎると、高周波成分の除数がばかげて大きくなる。周波数値を割って四捨五入すると、そのままゼロになる。その細部は保存されなかったのと同じだ。すると視覚情報のカテゴリごとまとめて消える。髪の毛、布地の織り目、セリフ書体のストロークの先端などが最初に失われる。
残る画面は、標準的なJPEGアーティファクトだ。8×8のブロックノイズ、グラデーションの縞状バンディング、鋭いエッジ周りのにじみやモスキートノイズ(mosquito noise)。大きな形は残っていても、この画像はもはや「人に見せる画像」ではない。アーティファクトのそれぞれの見た目がどう生まれるかは、別記事で図解した。
だから私の結論はこうだ。60が通常画像の実質的な下限である。そこからさらに下げて節約できる数KBは、一目で偽物とわかる代物で、価値がない。
「品質90」は共通通貨ではない。JPEG仕様には推奨量子化テーブル(Annex K)があるが、どのソフトがどのテーブルを使い、どうスケーリングするかは各社が決める。同じ「高品質」でも、よく使う四つのツールの数値はまったく違う。Photoshopの目盛りは0–12で、その10はリファレンス実装libjpegの90にほぼ相当する。GIMPとImageMagickはどちらも1–100の目盛りで、GIMPの「高品質」設定は85、ImageMagickは92だ。libjpegはリファレンス実装として、自身の参考値は90である。
二つのツールでどちらも「品質85」にしても、書き出されるファイルは同じにならない。だから一つのソフトで覚えた数値を、別のソフトにそのまま持ち込んではいけない。ソフトやプロジェクトをまたいで比較するなら、信頼できる方法は二つだけだ。実際の出力サイズを見る。実際の見た目を見る。
スライダーは頼りにならず、肉眼も画面やその時の状態に左右される。「違いがわからない」ことを数値化できるのか。できる。はるかに信頼できる方法は、別の物差しに替えることだ。それが構造類似性指数(SSIM、Structural Similarity Index Measure)だ。
これはピクセルを一つずつ比べるのではなく、構造・明るさ・コントラストの三つがどれだけ変わったかを見る。これは「違うピクセルが何個あるか数える」より、人間が目で画像を判断するやり方に近い。スコアは0から1で、1なら二枚は完全に同じだ。式とその導出は、WikipediaのSSIM項目が詳しい。
よくある品質設定に対するSSIMは、おおよそ次の水準だ。品質85のファイルは通常0.97超のスコアで、元画像と視覚的に区別できない。60まで落ちるとスコアは0.90–0.93、わずかに柔らかく、拡大してようやくわかる。40になると0.82–0.87しかなく、アーティファクトは肉眼で見える。
この数値はスライダーよりずっと正直だ。推測せずに品質を決めたいなら、ImageMagickのcompareコマンドで二枚のSSIMを直接計算し、「サイズを最大限節約しつつ、知覚のライン0.85を下回らない」点を探せる。この物差しの使い方は、別記事『SSIM詳説』にまとめた。
下の小さなツールはすべてブラウザ内で動作し、画像は一切送信されません。画像を選び(または「サンプル画像を試す」をクリック)、スライダーを動かしながら圧縮後のサイズとSSIMの変化を観察できます。SSIM ≥ 0.85 で最も小さいサイズになる設定を自動探索することもできます。SSIM値は圧縮したばかりの画像に対してリアルタイムに計算されます。前のセクションの物差しそのものです。
注:ブラウザ内蔵のJPEGエンコーダーはクロマサブサンプリングや量子化テーブルを公開していません。そのためこのツールはスライダーの実際の効果を見せ、差分をSSIMで定量化するもので、エンコーダーの内部を設定可能にするものではありません。そしてこの記事の主張をそのものずばり裏付けています。品質100は可逆ではなく、同じ数値でもソフトによって意味が違う、ということです。
ほとんどの場合、80前後で十分で、100をデフォルトにすべきではない。品質85のファイルのサイズは品質100の25%–40%に収まり、肉眼ではまったく違いがわからない。写真を安心して残すなら85–92、WebとSNSは75–82で十分、60未満は明らかなアーティファクトが出る。
いいえ。100にしても、JPEGは通常まずクロマサブサンプリングで約75%の色差情報を捨て、さらに量子化と丸めによって不可逆的な損失を生む。可逆が必要なら、PNG、TIFF、可逆WebPを使う。
PhotoshopのJPEG品質目盛りは0–12で、1–100ではない。その10はリファレンス実装libjpegの90にほぼ相当する。同じ数値でも、ソフトごとにマッピングは異なる。ソフトをまたいで数値をそのまま使わず、実際の出力サイズと見た目を基準にする。
元画像と拡大比較するのが最も直接的だ。客観指標が欲しいならSSIMを使う。品質85のJPEGは通常SSIMが0.97超で、元画像と視覚的に区別できない。40前後では0.82–0.87まで落ち、アーティファクトは肉眼で見える。ImageMagickのcompareコマンドでこのスコアを直接計算できる。
スライダー上の数字は除算パラメータで、画質の百分率ではない。100は可逆ではなく、60以下は崖だ。本当に一言で言うなら、写真は85で保存、Webに出すものは80、100はどこにも要らない——ファイルは倍増、画質は1ミリも上がらない。
形式選択、サイズ変更から品質調整、Web高速化まで一通り知りたいなら、『画像圧縮完全ガイド』を見てほしい。その流れ全体がその記事にまとまっている。