JPEGでは圧縮時にクオリティ(品質)を選択することが可能です。例えばMacのプレビューでは書き出し時に下記のような画面が出て品質の値を設定することができます。
この品質の値によってファイルサイズ、圧縮時間、復元時間、画質がそれぞれどのように変化するかを検証してみましたのでこのページで解説していきたいと思います。
検証方法
JPEGの圧縮(エンコード)と復元(デコード)はlibjpegを用いて行います。インストール方法やC言語を用いたプログラムの例は下のページで解説していますので詳しく知りたい方は読んでみてください
【C言語】libjpegのインストールと使用方法・使用例圧縮を行う画像は次の3つのものを使用します。
風景
文字
べた多め
クオリティによるファイルサイズの変化
下のグラフはクオリティの値によるファイルサイズの変化を表したものになります。横軸がクオリティの値で、縦軸がファイルサイズ(バイト)です。
風景や文字の場合はクオリティが90を超えたあたりからファイルサイズが極端に大きくなってしまうことが確認できます。ベタ塗り多い画像でもクオリティが高くなるにつれてファイルサイズも大きくなっていますが、他の2つほど増加はありませんでした。
クオリティによる圧縮時間の変化
下のグラフはクオリティの値による圧縮時間(エンコード時間)の変化を表したものになります。横軸がクオリティの値で、縦軸が圧縮時間(秒)です。
ベタ塗り多めの画像の場合は誤差はあるものの圧縮時間はほぼ一定です。一方風景と文字の場合はクオリティの値が高くなるにつれて圧縮時間が増加し、さらに80のあたりからその増加量が急激に大きくなります。
クオリティによる復元時間の変化
下のグラフはクオリティの値による復元時間(デコード時間)の変化を表したものになります。横軸がクオリティの値で、縦軸が復元時間(秒)です。
こちらも圧縮時間と同様の傾向の結果になっています。復元時間の方が圧縮時間よりも短い点や、クオリティ0付近ではベタ塗り・風景・文字ともに処理時間が特に違わないあたりは注目ポイントだと思います。
クオリティによる画質の変化
クオリティが0、20、40、60、80、100の時のJPEG圧縮画像を確認し、違いを比較してみます。
風景(0)
風景(20)
風景(40)
風景(60)
風景(80)
風景(100)
文字(0)
文字(20)
文字(40)
文字(60)
文字(80)
文字(100)
ベタ多(0)
ベタ多(20)
ベタ多(40)
ベタ多(60)
ベタ多(80)
ベタ多(100)
ベタ塗り多めの画像だと画質の違いが分かりにくいですが、風景の場合は特にクオリティ0の場合の画質が低いことが確認できると思います。一番画質の変化ぎ分かりやすいのは文字の画像です。文字の画像を拡大した結果は下のようになります。
文字拡大(0)
文字拡大(20)
文字拡大(40)
文字拡大(60)
文字拡大(80)
文字拡大(100)
ちょっとずつ画質が良くなっているのが分かりますか?上の画像をさらに拡大してみるともっと分かりやすくなると思います。このようにJPEGではクオリティが大きいほど画質を向上させることができます。ただ80以上になるともうほとんど画質に違いは見られなくなります。
まとめ
いろんな視点でJPEGのクオリティによる違いを見てきましたが、結論的には下記のようなことが言えると思います。
・クオリティ80くらいで画質は頭打ち
・クオリティ90くらいでファイルサイズや処理時間が極端に大きくなる
なので、JPEGの画質としては80くらいにしておくのが一番無難だと思います。
例えばMacのプレビューのJPEGクオリティ値の初期設定値は85です。おそらくこの辺りのことを踏まえてこの初期値が設定されていると考えられます。
今後JPEGで画像保存する際にクオリティを設定できるのであればこの記事を参考にしていただければ幸いです。