Google製JPEGエンコーダー「Guetzli」のインストール方法と使い方

Googleが公開したオープンソースのJPEGエンコーダーが「Guetzli(グェツリ)」です。

GitHub - google/guetzli: Perceptual JPEG encoder
Perceptual JPEG encoder. Contribute to google/guetzli development by creating an account on GitHub.

Guetzliを使うとlibjpegに比べて20~30%容量を小さくできるそうです。

この記事ではGuetzliをLinux(CentOS)にインストールする方法とその使い方を紹介していきます。

Guetzliをインストール

使用したOS

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

インストール手順

Guetzliをダウンロードします。記事更新時点での最新バージョンは1.01です。

wget https://github.com/google/guetzli/releases/download/v1.0.1/guetzli_linux_x86-64 -O guetzli

パーミッションを変更します。

chmod a+x guetzli

/usr/local/binへファイルを移動させます。

mv guetzli /usr/local/bin

以上でインストールは完了となります。

Guetzliの使い方

READMEに注意書きがあり、

  • 大量にメモリを消費するため、1MBの画像あたり300MBのメモリを用意する
  • たくさんのCPU時間を使用するため、1MBの画像あたり約1分かかる

とのことです。

今回使用した画像をこちらになります。

241KB

品質を設定する

guetzli --quality 数値 エンコードする画像.jpg 処理後のファイル名.jpg

実行結果

guetzli --quality 95 cookie.jpg cookie-q95.jpg

241KB→100KB

guetzli --quality 84 cookie.jpg cookie-q84.jpg

241KB→66.7KB

尚、83以下の数値を設定するとエラーというか警告が出て処理が中断します。

Guetzli should be called with quality >= 84, otherwise the
output will have noticeable artifacts. If you want to
proceed anyway, please edit the source code.
Guetzli processing failed

品質を83以下にしたい場合はソースコードを編集してくれとのこと。

使用メモリを制限する

guetzli --memlimit 数値(MB) cookie.jpg cookie-limit.jpg

デフォルトでは6000MBになっています。

実行結果

guetzli --memlimit 1 cookie.jpg cookie-limit.jpg

メモリ不足で失敗します。

Memory limit would be exceeded. Failing.

使用メモリを制限しない

guetzli --nomemlimit cookie.jpg cookie-nolimit.jpg

処理の詳細を出力する

guetzli --verbose cookie.jpg cookie-verbose.jpg

実行結果

Original Out[ 260531] BA[100.00%] D[0.0000] Score[260531.0000] (*)
Iter  1: f111111 quantization matrix:
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
  1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1     1  1  1  1  1  1  1  1   
Iter  1: f111111 GQ[ 0.00] Out[ 260466] BA[100.00%] D[0.0000] Score[260466.0000] (*)
~ ~~ ~
~ 省略 ~
~ ~~ ~
YUV444 selected quantization matrix:
  5  5  5  5  5  5  7  7     5  5  5  5  5  5  7  7     5  5  5  5  5  5  7  7   
  5  5  5  5  5  7  7  7     5  5  5  5  5  7  7  7     5  5  5  5  5  7  7  7   
  5  5  5  5  7  7  7  7     5  5  5  5  7  7  7  7     5  5  5  5  7  7  7  7   
  5  5  5  7  7  7  7  7     5  5  5  7  7  7  7  7     5  5  5  7  7  7  7  7   
  5  7  7  7  7  7  7  7     5  7  7  7  7  7  7  7     5  7  7  7  7  7  7  7   
  7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7   
  7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7   
  7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7     7  7  7  7  7  7  7  7   
Iter 10: f111111(7) up Coeffs[22315/45390] Blocks[3386/4654/5000] ValThres[0.7288] Out[ 110471] EstErr[-0.03%] BA[100.00%] D[0.9744] Score[126218.8251]
Iter 11: f111111(7) up Coeffs[9019/23074] Blocks[3416/4509/5000] ValThres[0.0867] Out[ 106094] EstErr[0.03%] BA[100.00%] D[1.1508] Score[819000892.7898]
Iter 12: f111111(7) up Coeffs[7737/13033] Blocks[3270/3868/5000] ValThres[0.0887] Out[ 102029] EstErr[0.04%] BA[100.00%] D[1.2074] Score[5189064991555685555522820919787520.0000]
Iter 13: f111111(7) up Coeffs[3335/3417] Blocks[1640/1667/5000] ValThres[0.0659] Out[ 100284] EstErr[0.07%] BA[100.00%] D[1.2077] Score[5196319964608550532087569461542912.0000]
Iter 14: f111111(7) up Coeffs[34/34] Blocks[23/23/5000] ValThres[0.0451] Out[ 100253] EstErr[0.06%] BA[100.00%] D[1.2077] Score[5196319964608550532087569461542912.0000]
Iter 15: f111111(7) down Coeffs[831/39555] Blocks[554/4150/5000] ValThres[0.0123] Out[ 100687] EstErr[0.04%] BA[100.00%] D[1.1635] Score[1470145891.9499]
Iter 16: f111111(7) down Coeffs[774/36378] Blocks[497/3868/5000] ValThres[0.0124] Out[ 101099] EstErr[0.04%] BA[100.00%] D[1.1629] Score[1426656284.3881]
Iter 17: f111111(7) down Coeffs[706/32814] Blocks[498/3526/5000] ValThres[0.0150] Out[ 101479] EstErr[0.05%] BA[100.00%] D[1.1151] Score[131412233.2496]
Iter 18: f111111(7) down Coeffs[586/26780] Blocks[390/2926/5000] ValThres[0.0130] Out[ 101791] EstErr[0.04%] BA[100.00%] D[1.1044] Score[77106972.1730]
Iter 19: f111111(7) down Coeffs[450/19667] Blocks[283/2245/5000] ValThres[0.0114] Out[ 102034] EstErr[0.04%] BA[100.00%] D[1.0558] Score[6825799.1727]
Iter 20: f111111(7) down Coeffs[291/12315] Blocks[201/1453/5000] ValThres[0.0136] Out[ 102181] EstErr[0.04%] BA[100.00%] D[1.0379] Score[2789615.7083]
Iter 21: f111111(7) down Coeffs[173/7157] Blocks[114/863/5000] ValThres[0.0134] Out[ 102265] EstErr[0.03%] BA[100.00%] D[1.0108] Score[720222.3582]
Iter 22: f111111(7) down Coeffs[118/3635] Blocks[69/450/5000] ValThres[0.0152] Out[ 102348] EstErr[0.05%] BA[100.00%] D[0.9981] Score[381350.6034]
Iter 23: f111111(7) down Coeffs[102/1710] Blocks[60/212/5000] ValThres[0.0306] Out[ 102380] EstErr[0.02%] BA[100.00%] D[0.9795] Score[150826.5518]
Iter 24: f111111(7) down Coeffs[96/373] Blocks[40/56/5000] ValThres[0.1590] Out[ 102465] EstErr[0.05%] BA[100.00%] D[0.9718] Score[102465.0000] (*)

さいごに

以上がGuetzliのインストール方法と使い方になります。

実際に使ってみると分かりますが、250KBの画像1枚を圧縮するだけでも処理に結構時間がかかります。

ただ、Guetzliはノイズを視覚的に分かりにくく処理しているそうなので、なるべく品質を維持しつつ容量を減らしたい場合には良いかもしれません。

コメント

タイトルとURLをコピーしました