GoogleがリリースしたJPEGエンコーダー「guetzli」で実際に試してみました。
2017年3月16日、Google Research Blog上で
「Announcing Guetzli: A New Open Source JPEG Encoder」
というタイトルで「guetzli」がアナウンスされました。
guetzliは 広く使われている 'libjpeg
' ( JPEG画像への変換などをするライブラリ ) より
画像のクオリティを保ったまま、20 - 30% ファイルサイズを小さくする目的で
開発されたJPEGエンコーダーだそうです。
libjpegというと、プログラミングをする人にはお馴染みの 'ImageMagick
' で
JPEGを操作する時に使われているライブラリです。
っということで、実際にguetzliを使って どれぐらい画像ファイルが小さくなるか試してみました!
guetzliは各プラットフォーム用の導入方法が公開されていますが、
パッケージマネージャーを経由か、自前でビルドする必要があります。
# MAC * Homebrewを使う場合
brew install guetzli
# Ubuntu #
# 依存パッケージのインストール
apt-get install libpng-dev libgflags-dev
# レポジトリからソースの入手
https://github.com/google/guetzli.git
cd guetzli
make # binフォルダが作成される
# /guetzli/bin/Release/guetzli が実行ファイル
# windows用の導入方法URL
https://github.com/google/guetzli#user-content-on-windows
正しく導入されると、
コマンドライン上からバイナリを実行 || 'guetzli
' コマンドで下記の様に表示されます。
$ guetzli
guetzli: Guetzli JPEG compressor. Usage:
guetzli [flags] input_filename output_filename
Flags from /tmp/gflags-20161127-67722-db5bgz/gflags-2.2.0/src/gflags.cc:
-flagfile (load flags from file) type: string default: ""
......
guetzliは機能が絞られているので、使い方は簡単です。
第一引数で' 読み込む画像 ( JPEG || PNG)
' 、第二引数で ' 作成される画像ファイル名
' になります。
( * 発行する画像はJPEGのみ対応 )
また、オプションで ' verbose
' ( エンコードの進歩状況 )、' quality
'で画像の品質が調整できます。
guetzli [--quality Q] [--verbose] input.png output.jpg
guetzli [--quality Q] [--verbose] input.jpg output.jpg
# オプションを使う場合
# qualityを調節 (デフォルトは95) #
guetzli --quality 100 --verbose base.jpg output.jpg
今回はMacのHomebrewを使って guetzl を導入し、下記の3MB
のJPEG画像を使って
" guetzli
"と" libjpeg (ImageMagickを使用)
" のエンコードした時のファイルサイズを比較しました!
* 画像の情報
KIND: JPEG image
SIZE : 3MB(2,967,977 bytes)
Dimention : 4928 × 3264

下記のスニペットが検証に使用したコマンドです。品質とファイルサイズを公平に比較する為に
guetzli、libjpeg( ImageMagic ) 共に qualityの値は' 100
'に設定しています。
# 検証に使用したコマンド * 共にサイズ変更無し
# guetzli
guetzli --quality 100 base.jpg g-output.jpg
# libjpeg (ImageMagic)
convert -quality 100 base.jpg i-output.jpg
下の画像がguetzliとlibjpegを使ってエンコードしたJPEGファイルを並べた画像です。
全体像は肉眼では色彩を含めて 違和感0なぐらい変化が無かったので、9倍にズーム
しました。
guetzli
'、真ん中がエンコード前の元画像、右が'libjpeg
' 
続いて、JPEGのファイルサイズの比較です。
libjpegの場合 3MB -> 2.4MB。 品質を落とさずに約19.1%
ファイルサイズを小さくできました。
libjpeg
) 2,967,977 bytes -> 2,403,145 bytes 
guetzliの場合 3MB -> 1.7MB 元画像から約42.4%
ファイルサイズが小さくなりました。
guetzli
) 2,967,977 bytes -> 1,709,341 bytes 
実際に自身の環境で検証した結果 、libjpeg -> guetzli 比で約23%画像のファイルサイズが小さくなりました。
「libjpegと比較して20 - 30% ファイルサイズを小さくすること可能」という発表も本当のようです!
注意が必要なのが、guetzliを使ってエンコードをしている最中は 結構なメモリを消費します。
公式レポジトリのREADMEファイルには下記のように記載されています。
" Note: Guetzli uses a large amount of memory. You should provide 300MB of memory per 1MPix of the input image."
( 読み込む画像、1Mピクセル毎に 約300MBのメモリを消費します )

その他、エンコードに掛かる時間は 'libjpeg'が数秒で終わるの対し、
guetzliで3MBのJPEGファイルをエンコードしている時は30分程かかりました。
( * 数十KB ~ 100KBぐらいの画像なら気になるほど時間は掛かりません )
以上がguetzliの紹介でした。
guetzliを実際に使った結果、以下のように感じました。
・ 既存画像のエンコードをし直す場合、現状では 高性能マシンじゃないとバッチ処理には向かない
・ Amazon S3などの転送量を意識するようなサービスを利用するなら利点は大きい
・ これから新規にアップロードしていく画像で利用するなら利点が大きい
guetzliはリリースされたばかりなので 導入までの敷居は少し高めですが、
これからguetzliを使ったラッパーやライブラリが多数リリースされていくと思います。
ニュースサイトで画像を沢山扱うようなサービスにはオススメできるエンコーダーなので、
気になった人はゼヒ×2 チェックしてみてください!
* 番外編として「guetzli」の複数の画像を圧縮できるCLIラッパーを作ってみました。
こちらのGistページからファイルをコピーして 適当なフォルダに
'.py
'( Python )のファイルを作成 & コードを貼り付け後、'.bashrc
' || '.zshrc
' からコマンド名 & パスを通せば使えます。
# OS: Mac, Python: 3.6, 2.7.13, pypy5.7.0で動作検証しました
# .bashrc OR .zshrc
# お好きなコメンド名にして、gistからコピー & 作成したpythonファイルのパスを通せば使えます
# この場合のコマンド名は 'myguent'
alias myguent='python /YOUR/PATH/guetzli.py '
# 使い方
myguent myimg.jpeg
# 複数の画像を一度にロスレス圧縮する場合
myguent myimg1.jpeg myimg2.jpeg myimg3.jpeg
GitHub : google/guetzli