Googleが開発したJPEGエンコーダー「guetzli」を試してみた



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のインストール

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の使い方

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

 

guetzliの検証

今回はMacのHomebrewを使って guetzl を導入し、下記の3MBのJPEG画像を使って
" guetzli "と" libjpeg (ImageMagickを使用) " のエンコードした時のファイルサイズを比較しました!

* 画像の情報
KIND: JPEG image
SIZE :  3MB(2,967,977 bytes)
Dimention :  4928 × 3264

* 検証に使った画像 (Unsplashに投稿されている画像) ( * 記事に載せる為にリサイズしています )

下記のスニペットが検証に使用したコマンドです。品質とファイルサイズを公平に比較する為に
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のメモリを消費します )

 guetzliでエンコードをしている最中は2G~3G超のメモリを消費していました 

その他、エンコードに掛かる時間は 'libjpeg'が数秒で終わるの対し、
guetzliで3MBのJPEGファイルをエンコードしている時は30分程かかりました。
( * 数十KB ~ 100KBぐらいの画像なら気になるほど時間は掛かりません )

Summary

以上が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

 

この記事のカテゴリ
プログラミング

この記事に付けられているタグ



その他の運営サービス

最新の記事