画像のファイルサイズ低減について検討する機会があったので、記録しておきます。
画像のファイルサイズを決定する要因
WEBでよく使われるJPEGとPNGに絞って説明します。
ざっくり言って以下のとおりです。ざっくり解説なので、細かいところは間違っているかもです。
解像度
●ピクセル × ●ピクセル というやつです。
色のきめ細かさ
各ピクセルの色を、どの程度きめ細かく表現するか、ということです。
JPEGの話
JPEGでは、色の再現度は圧縮率によって変わってきます。
JPEGでは、広い範囲にわたる情報についてはきめ細かく(多くのbit数を割り当てて)色を表現するのに対し、狭い範囲にわたる情報については、大雑把に(少ないbit数を割り当てて)色を表現します。
こういったデータ削減処理をどのくらい強くするか、というの圧縮率です。圧縮率を高くするほど、コントラストが下がり、エッジ(境界部分)がぼやけます。
(こういった特徴があるので、JPEGはエッジのはっきりとしたイラスト画像には向いておらず、風景写真のようなエッジがあまり際立たなない画像に向いている、と言われます。)
なお、圧縮率と解像度は独立したものです。圧縮率が変わっても、解像度は変わりません。
PNGの話
PNGでは、以下のどれかを選択することになります。
PNG-8 (ビット深度:8)
各ピクセルの色を8bitで表現します。使える色は 2の8乗 = 256色 だけです。
PNG-24 (ビット深度:24)
各ピクセルの色を24bitで表現します。使える色は 2の24乗 = 約1,670万色 です。これはJPEGの上限と同じです。
PNG-48 (ビット深度:48)
各ピクセルの色を24bitで表現します。使える色は 2の48乗 = 約280兆色 です。
さらに、上記のビット深度とは別次元で、透明度(αチャンネル)というものがあり、8bitなら256段階、16bitなら65536段階の透明度を選択できます。
ビット深度のbit数 + 透明度のbit数 の情報が、ピクセルごとに保持されます。最大で、ピクセルあたり64bit(ビット深度48bit + 透明度16bit)になっちゃいます。
ビット深度と透明度の組み合わせについては、制限があるとか無いとか。確認中です。
当然ながら、ビット深度と解像度も独立したものです。ビット深度を変えても解像度は変わりません。
画像のファイルサイズを低減させる方法
ということで、画像のファイルサイズを低減させるには、ファイルサイズに影響を与える以下の2点を下げればよいわけですね。
- 解像度
- 色のきめ細かさ
解像度については説明は不要かと思いますが、色のきめ細かさを下げるにはどうすれば良いのでしょうか?
元の画像を、圧縮率の高いJPEGやビット深度の低いPNGに変換すればよいはずですね。
参考
https://michisugara.jp/archives/2012/img_format.html
http://funini.com/kei/math/jpeg.shtml
https://news.mynavi.jp/article/osxhack-130/
http://www-creators.com/archives/2322
https://www.marguerite.jp/Nihongo/Labo/Image/JPEG.html#PROCCESS
http://www-creators.com/archives/1031
https://www.attend.jp/desine_171028
https://nexlink-cs.nlk.jp/040_knowledge/detail/file_count/NEXLINK_mame01_ver2.pdf