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はノイズを視覚的に分かりにくく処理しているそうなので、なるべく品質を維持しつつ容量を減らしたい場合には良いかもしれません。
コメント