話題の記事

GoogleのJPEGエンコーダーGuetzliを試してみた

2017.09.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSチームのすずきです。

GoogleがOSSとして公開しているJPEGエンコーダーの「Guetzli」。 従来のJPEG変換ツールと比較し、画質を保ちつつ35%のファイルサイズを抑制できると謳われています。

今回Ec2環境(Amazon Linux)上で、「Guetzli」と「ImageMagick」によるJPEGファイルの最適化を実施し、比較を行う機会がありましたので紹介させていただきます。

準備

Ec2

  • OS: Amazon Linux 201707
    • amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • インスタンスタイプ: c3.large

guetzli

  • 公式サイト で配布されている、linux_x86-64用バイナリを利用しました。
sudo curl -L -o /usr/local/bin/guetzli_linux_x86-64 https://github.com/google/guetzli/releases/download/v1.0.1/guetzli_linux_x86-64
sudo chmod 755 /usr/local/bin/guetzli_linux_x86-64

ImageMagick

  • AmazonLinux標準リポジトリより、ImageMagickパッケージをインストールしました。
sudo yum install ImageMagick
  • ImageMagickのバージョンは6.7.8でした
$ convert --version
Version: ImageMagick 6.7.8-9 2016-06-22 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

処理画像

  • 2017年8月 「めそ子」壁紙(1920x1024)のPSDファイル(23.2MB)を利用しました。
  • ImageMagickを利用して、最高品質(quality:100)のJPEGファイルを4つ、異なる画像サイズ用意しました。
convert  -quality 100 mesoko_1708_1920x1080.psd[0] mesoko_1708_1920x1080.jpg
convert  -quality 100 -resize 1280x720 mesoko_1708_1920x1080.psd[0] mesoko_1708_1280x720.jpg
convert  -quality 100 -resize 960x540 mesoko_1708_1920x1080.psd[0] mesoko_1708_960x540.jpg
convert  -quality 100 -resize 480x270 mesoko_1708_1920x1080.psd[0] mesoko_1708_480x270.jpg

クラスメソッド2次元社員 2代目めそ子のコーナー

  • mesoko_1708_1920x1080.jpg

mesoko_1708_1920x1080

変換

  • guetzliは、guetzliで指定出来る範囲(84〜100)より、84、90、95、99 を指定して変換を実施しました。
  • ImageMagickは、30〜99の範囲で変換を実施しました。

guetzli

for file in `ls -1 mesoko_1708*.jpg`; do
   for quality in 84 90 95 99; do
     echo "im-${quality}-${file}"
     time guetzli_linux_x86-64 --quality ${quality} ${file} guetzli-${quality}-${file}
     sleep 1
   done
done

ImageMagick

for file in `ls -1 mesoko_1708*.jpg`; do
   for quality in 30 40 50 60 84 90 95 99; do
     echo "im-${quality}-${file}"
     time convert -quality ${quality} ${file} im-${quality}-${file}
     sleep 1
   done
done

結果

ファイルサイズ

guetzli

解像度\品質 オリジナル 99 95 90 84
1920x1080 1588K 872K 381K 247K 190K
1280x720 798KB 436K 210K 137K 109K
960x540 514KB 274K 137K 93K 74K
480x270 193KB 89K 45K 33K 26K

ImageMagick

解像度\品質 オリジナル 99 95 90 84 70 60 50 40 30
1920x1080 1588K 1311KB 614K 431K 345K 260K 229K 210K 191K 172K
1280x720 798KB 680K 364K 269K 222K 174K 157K 145K 134K 123K
960x540 514KB 451K 258K 199K 168K 137K 125K 117K 110K 102K
480x270 193KB 189K 128K 110K 99K 89K 85K 82K 79K 77K

所要時間

  • 「time」コマンドで取得した「real」の測定値です

guetzli

解像度\品質 84 90 95 99
1920x1080 1m56.109s 1m55.655s 2m37.065s 5m6.957s
1280x720 0m58.797s 1m2.230s 1m8.546s 2m15.623s
960x540 0m31.914s 0m32.723s 0m37.941s 1m12.668s
480x270 0m9.549s 0m9.797s 0m11.831s 0m20.132s

ImageMagick

解像度\品質 84 90 95 99
1920x1080 0m0.092s 0m0.095s 0m0.100s 0m0.126s
1280x720 0m0.046s 0m0.047s 0m0.050s 0m0.062s
960x540 0m0.030s 0m0.031s 0m0.034s 0m0.041s
480x270 0m0.013s 0m0.014s 0m0.015s 0m0.016s

画質比較

1920x1080 の画像を拡大し、品質の確認を試みました。

オリジナル

  • ファイルサイズ: 1588K

guetzli-original-mesoko

quality:90

guetzli (ファイルサイズ: 247K)

guetzli-90-mesoko

ImageMagick (ファイルサイズ: 431K)

guetzli-i90-mesoko

quality:84

guetzli(ファイルサイズ: 190K)

guetzli-84-mesoko

ImageMagick(ファイルサイズ: 345K)

guetzli-i84-mesoko

quality:40

ImageMagick (ファイルサイズ: 191K)

guetzli-i40-mesoko

まとめ

guetzli、ImageMagickで同等の画像品質を指定した場合、ファイルサイズが小さくなる事。 また、ファイルサイズを揃えた場合には、guetzliはノイズが少ない事が確認できました。

AWSではインターネットへのアウトバウンド通信に応じた従量課金が発生し、 東京リージョンのEC2では、1GBの通信毎に$0.140(2017年9月時点)のコストとなります。

仮に、月間10TBのJPEGデータをEC2(ELB)から配信しているWebサイトで、 guetzliを利用して表示品質を落とさず、ファイルサイズを35%抑制する事が出来た場合、 490$($0.14 × 10000 * 0.35)のコスト削減が期待出来る可能性があります。

また、ファイルサイズの抑制はクライアント側の負荷を軽減する効果も期待できます。 特に3G、LTEなどのモバイル回線から利用される場合には、ユーザが負担するパケット代の抑制や 回線が混雑する時間帯の表示速度の改善効果も高いと予想されます。

高品質な画像変換エンジンとして活用できる可能性のある「guetzli」、 ImageMagickと比較して処理時間は大幅に長くなる傾向にありますが、 次回はAWS Lambdaを活用した非同期処理により、 より効果的に活用する方法について紹介させて頂きたいと思います。

  • Lambdaでguetzli

guetzli-mesoko-00