画像圧縮・変換 web アプリ “Squoosh” のコマンドラインツール “Squoosh CLI”

“Squoosh” は画像の劣化を大きく抑えて圧縮する webp などの次世代圧縮フォーマットへの変換を行える、Google 製の Web アプリケーションです。Web 上では複数枚の変換・圧縮を行えませんが、Node.js モジュールとして提供されている “Squoosh CLI” を使えば、連続的に一括変換・圧縮が行えます。

概要

"Squoosh CLI" は Web アプリケーションのものと同様に、webp 以外にも jpg (mozjpeg) や、png (oxipng) への相互変換や、リサイズ、画像の回転、色数の減少などの機能を備えており、Linux コマンドと連携することで容易に高いパフォーマンスを持つ画像フォーマットへ、連続的に変換することができます。
以下ではその一例をメモとして残します。

インストール

README にある通り、npm によりグローバルインストールしてください。

npm i -g @squoosh/cli

まずは最低限なコマンドを確認。
以下でカレントディレクトリの jpg ファイルを webp に変換します。
※画像以外のファイルを処理しようとするとエラーあるいは、処理が進行しなくなります

squoosh-cli ./*.jpg --webp

以下では、Linux コマンドと、パイプによって組み合わせ、ある基準以上の容量を持つ複数の画像ファイルを、リサイズするとともに jpg(mozjpeg) に変換したい場合を想定しています。

ls -lh |
  awk '{ if(int($5) >= 500) print $9 }' |
  xargs -I{} \
  squoosh-cli \
    --mozjpeg '{ quolity: 80 }' \
    --resize '{ width: 640 }' \
    -d images_dir \
    {}

オプションについて

-d <dir> のように出力先ディレクトリを指定できます。
この時対象のディレクトリが存在しない場合、新しく作られます。

このほか、変換方式を --mozjpeg のように指定したすぐ後ろに、json 表記で設定を指定しています。
上の例ですと、品質を 80 とした jpeg への変換を、幅 640 ピクセルとしてリサイズします。
詳しいオプションについては codecs.js を参照してください。
※目当てのオプション、例えば「mozjpeg」をページ検索すると手っ取り早いです

なお、上の例ですと、幅が 640 ピクセル以下のファイルであっても 640 ピクセルに拡大リサイズされてしまいます。
この場合、例えば以下のように identify コマンドなどを使用して、幅サイズを取得し、さらに対象ファイルを絞り込むことも可能です。
identify を使用するためには ImageMagick をインストールします

ls -1h *.jpg | while read fname
do
  size=$(du $fname | cut -f1)
  width=$(identify -format "%w" $fname)
  
  # 500kb 以上であるかいなか
  if [ $size -ge 500 ]; then
  
    # width が 640 より大きいか否か
    if [ $width -gt 640 ]; then
      squoosh-cli \
        --mozjpeg '{ quolity: 80 }' \
        --resize '{ width: 640 }' \
        -d images_dir \
        $fname
    else
      squoosh-cli \
        --mozjpeg '{ quolity: 80 }' \
        -d images_dir \
        $fname
    fi

  fi
done