画像を圧縮するのに、「Squoosh」を使って、ドラッグ&ドロップで1枚1枚圧縮していました。
一括でできないかなぁと思っていたら、「コマンドライン版」があるのに今更気が付きました。
インストール方法
npm i -g @squoosh/cli
簡単な使い方
jpgファイルを出力したい場合
squoosh-cli --mozjpeg '{}' -d <出力ディレクトリ> <入力ファイル名>
--mozjpegのconfigにはautoを指定して自動オプティマイザーを利用することもできるのですが、自分の環境では、「RuntimeError: memory access out of bounds」が高い確率で出て圧縮に失敗するので、{}を指定しています。
例:圧縮したhoge.jpgをoutput_dirディレクトリ下に出力する
squoosh-cli --mozjpeg '{}' -d output_dir hoge.jpg
リサイズしたい場合
squoosh-cli --mozjpeg '{}' --resize '{"width":<幅のピクセルサイズ>, "height":<高さのピクセルサイズ>}' -d <出力ディレクトリ> <入力ファイル名>
例:hoge.jpgの幅を850pxにする。
squoosh-cli --mozjpeg '{}' --resize '{"width":850}' -d output_dir hoge.jpg
一括実行ツールを作成する
Pythonで一括実行ツールを作成してみました。
画像を圧縮し、かつ、横長であれば、幅を850pxにリサイズ、縦長であれば、高さを850pxにリサイズします。
resize.py
# -*- coding: utf-8 -*-
import sys
import subprocess
from PIL import Image
if __name__ == "__main__":
file_list = []
with open('file_list.txt', 'r', encoding='UTF-8') as f:
for line in f:
line = line.rstrip('\n')
if not line:
break
file_list.append(line)
for filename in file_list:
filename = 'input/' + filename
im = Image.open(filename)
resize_opt = '{"width":850}'
if im.width < im.height:
resize_opt = '{"height":850}'
cmd = 'squoosh-cli --mozjpeg {} --resize ' + resize_opt + ' -d output ' + filename
# rc = subprocess.Popen(cmd, shell=True)
rc = subprocess.call(cmd, shell=True)
コメントアウトしている「subprocess.Popen」であれば、コマンドが非同期で実行できるのですが、自分の環境で並列でsquoosh-cliを実行すると、完了するまでPCが操作不能になってしまいました。
使い方
- 上記のコードをコピーして、resize.py(名前は任意)を作成する。
- resize.pyと同じディレクトリに「input」「output」ディレクトリ、「file_list.txt」を作成する。
- inputディレクトリ下に圧縮&リサイズしたい画像を配置する。
- file_list.txtに画像ファイル名を記述する。(1行1ファイル)
- 「python resize.py」を実行する。
file_list.txtの記述例
hoge.jpg
foo.jpg