mozjpegをWindowsで使うためのバッチファイル
以前の記事「mozjpegでJPEGを一括縮小するバッチファイル」ではmozjpegのコンパイル済みモジュールの配布※と、フォルダを指定して一括でJPEGファイルを縮小するバッチファイルを紹介しました。
(※Mozillaが開発した圧縮効率の高いJPEGエンコーダーなのですがソースしか公開されていないため)
ぼくもブログに掲載する写真や画像をなるべく小さくするためにこのバッチファイルを使ってJPEGを一括縮小していたのですが、フォルダの指定だけじゃちょっと不便だなぁと感じるようになり、ディレクトリでもファイルでもどちらをドラッグ&ドロップしても動くように改良しました。
コンパイル済みmozjpeg(cjpeg.exe)とバッチファイル
こまけぇこたぁいいんだよ!今すぐWindowsで使えるmozjpegをくれ!という方はこちらをどうぞ。
https://blog.ver001.com/uploads/mozjpeg-3.3.1-batch.zipこのZIPの中にはmozjpegの本体であるcjpeg.exeと、それを簡単に使うためのmozjpeg.batが入っています。
(ちなみに、2019年5月7日現在で最新のmozjpeg 3.3.1をコンパイルして同梱)
使い方は簡単。mozjpeg.batファイルに縮小したいJPEGファイルをドラッグ&ドロップするだけ。
フォルダ内にあるたくさんのJPEGファイルを一括縮小したい場合は、フォルダごとドラッグ&ドロップすればOKです。
ドラッグ&ドロップしたファイルのあるフォルダの下に mozjpeg という新しいフォルダが自動的に作られ、そしてそのフォルダに縮小済みのJPEGファイルが作られます。元のJPEGファイルを上書きしたりはしないのでその点はご安心を。
mozjpegをWindowsで動かすバッチファイルの解説
mozjpegのバッチファイルを自分で改良したい方向けに簡単に動作を解説しておきます。
バッチファイルの中身
@echo off if exist "%1\*" ( cd /d "%1" mkdir "mozjpeg" > nul 2>&1 for %%A in (*.jpg) do ( echo %%A "%~dp0cjpeg.exe" -optimize -quality 85 -outfile "mozjpeg\%%A" "%%A" ) ) else if exist "%1" ( cd /d "%~dp0" mkdir "%~dp1mozjpeg\" > nul 2>&1 echo "%1" "%~dp0cjpeg.exe" -optimize -quality 85 -outfile "%~dp1mozjpeg\%~nx1" "%1" )
解説
最初の if exist "%1\*" の部分で、ドラッグ&ドロップされたのがディレクトリかどうかを判定しています。
ディレクトリだった場合はそのまま次の行へ進み、ディレクトリ移動→mozjpegディレクトリの作成→*.jpgに該当するファイルをすべてcjpeg.exeに渡して変換。
ディレクトリではなかった場合はファイルが1つ指定されたと仮定して、cjpegに渡しています。
ちなみに、mkdirコマンドの > nul 2>&1 の部分はエラーメッセージを出さないようにする処理です。既にmozjpegフォルダがあった場合に「既に存在します」と表示されてしまうのを防いでいるんですね。
それから、JPEG品質については -quality 85 と85固定にしてしまっているため、変更したい場合はその部分を直接編集してください。
まとめ
- 「mozjpegでJPEGを一括縮小するバッチファイル」でフォルダ指定式の一括縮小バッチを作ったものの、ファイル指定もしたくなったため、バッチファイルを改良してみた。
というだけのお話でした。
以前はmozjpegをWindowsのGUIで動かすVoralent Antelopeというアプリもあったようなのですが、現在ホームページがなくなってるんですよねー。なんでだろ。
まぁそれはともかく、ぼくはWindowsがメイン環境なので、Windowsで動くmozjpegがないと困るんですよね。
GUIまで開発するのは骨なので、とりあえずファイルやディレクトリをドラッグ&ドロップするだけで動くバッチファイルを作ってみたのでした。
ただ、今回バッチファイルを書いていて思ったのは、バッチだとディレクトリの判定がイマイチ怪しいんですよねー。
if exist "%1\" だけではうまく動かないケースもあったりして。仕方なく if exist "%1\*" と書いたらなぜか動いた、という気持ち悪い状況。
こんなことなら VBScript あたりで書いたほうが良かったかもなぁとちょっと思っています。