画像ファイルの圧縮アルゴリズムZopfli、Guetzli

Posted by 雅楽斎 on Thursday, July 4, 2019

TOC

画像ファイルの圧縮アルゴリズム

現在広く使われるようになった画像ファイルフォーマットであるjpegやpng。一般家庭に普及している、画面を持つ大多数の機器でサポートされているこれらのフォーマットに対して、Googleは2013年にZopfli、2016年にGuetzliを発表しました。

Zopfli

zopfliはdeflate形式のデータ圧縮を行うソフトウェアです。このdeflateはgzipに使われる他にPNGにも使われており、zopfliを使用することでlibpngでデコード可能なデータを生成→libpngとは違った圧縮方法でpng画像を生成できることを意味します。

アプローチとしては、同じデータを見つけて繰り返しに置き換えることでサイズを減らすLZSSというアルゴリズムを何回も繰り返す事でもっとサイズを減らす、ということのようです。この結果、既存の圧縮方法よりも小さいサイズでpngファイル1を生成できる反面、処理時間は多く必要になります。

Guetzli

guetzliはlibjpegライブラリ比較で同等品質でファイルサイズを20~30%減という触れ込みです。アプローチとしては人間に気づきにくいものを間引く、Butteraugliというアルゴリズムでスコアが同一となった出力ファイルが結果的にファイルサイズが縮んでいる、とのこと。

この2つの圧縮ソフトウェアでどのくらい差がでるのか試しました。

比較に使用する画像ファイル

https://pro.foto.ne.jp/free/product_info.php/cPath/21_27_130/products_id/3733

属性としては2000x3008の噴水jpg画像です。あまりpngにはしないタイプの画像を選びました。

Zopfliでテスト

まず、元がjpgなのでpngにします。png生成に使うのはimagemagickのmogrify。これに対してどのくらい縮むのかの確認になります。

$ mogrify -format png wtr0101-044.jpg

これで生成したpngファイルに対してzopfliで圧縮をかけます。オプションはデフォルト。バイナリはUbuntu18.04LTSの1.0.1+git160527-1。実行環境はWindows10上のWSL(Ubuntu18.04LTS)なので処理時間は目安程度にして頂ければ。

$ time zopflipng wtr0101-044.png wtr0101-044_zopfli.png
Optimizing wtr0101-044.png
Input size: 9196236 (8980K)
Result size: 8427709 (8230K). Percentage of original: 91.643%
Result is smaller

real    2m6.896s
user    1m58.672s
sys     0m1.484s

8.4%ではありますが、確かにmogrifyで圧縮したものよりサイズは小さくなっています。自然画像なのでそれほど差が出なかったんでしょうか(あるいはmogrifyも優秀)

Guetzliでテスト

実行環境は同じくWSL上のUbuntu、バージョンは1.0.1-1。

$ time guetzli wtr0101-044.jpg wtr0101-044_guetzli.jpg

real    9m56.169s
user    8m21.016s
sys     0m10.984s

これは遅い!ファイルサイズについては2089305バイトから1676410バイトになっているので20%縮んでいます。遅いついでにいつ終わるのかなぁと思ってタスクマネージャみたらRAMも1GB使ってたのでリソースに相当余裕がないと常用は難しいかなぁという印象です。

元画像とGuetzliで圧縮した画像の比較

ぶっちゃけWindowsについてるフォトで見比べてるだけなんで引きだとわからないというのが正直なところ。一部分をズームして比較したものが以下です。

元画像とGuetzliで圧縮した画像の比較(ズーム)

Guetzli前後の比較は以下になります。ズームするとわからないレベルかと思うんですが引きで見たときは濃淡の激しい場所がマイルドになっちゃってる気もします。ただオリジナルと見比べないと気付かないだろうなとも。

雑感

Zopfliについては時間がかかるのは間違いないが可逆圧縮でサイズを縮められるのはそれだけで大きなメリットだと思うので、余裕があれば使いたい2くらい良いと思います。

Guetzliはとにかく実行時間が長いのと、大量のRAMを長時間拘束するので常用しようと思うと大変ではないかと思います。確かにサイズが縮むのは間違いないので、用途としては何万回もダウンロードされる用途の画像では転送量が縮むことのメリットが大きいです。サンプル配布の目的で使うならありかなぁ。但し、オリジナルとは異なりますという注意書きはした方がいいのかもしれないですね。


  1. pngに限らずgzipもそうなのですが [return]
  2. というかこっちがデファクトスタンダードになって色んなソフトで保存時に選択できるようにしてほしい [return]

comments powered by Disqus