pngquant を使って画像(PNG)を一括圧縮するバッチを作ってみた
おはようございます。
先日、JPEG形式の画像ファイルを圧縮してみたので、
今回はPNGの圧縮をコマンドから実行できる「pngquant」というソフトを試してみたいと思います。
JPEGの圧縮についてはこちら。
スポンサーリンク
ダウンロード
次のサイトにアクセスします。
「Binary for Windows」をクリックしてファイルをダウンロードします。
インストール
ダウンロードした圧縮ファイルを展開し、任意の場所に格納します。
今回は「D:\Software\pngquant」としました。
環境変数の設定
exeが存在するディレクトリ以外でも実行できるように環境変数にパスを追加します。
[ Win ] + [ Break ] 、またはエクスプローラーなどで、PCのプロパティを開きます。
「システムの詳細設定」メニューを選択します。
「詳細設定」タブの「環境変数」ボタンをクリックします。
「システム環境変数」の「Path」を選択して「編集」ボタンをクリックします。
「新規」ボタンをクリック、表示された入力画面で、先ほど pngquant を格納したディレクトリを設定、「OK」ボタンをクリックします。
確認
コマンドプロンプトを起動し、次のコマンドを実行します。
pngquant -V
上記のように表示されれば、インストール完了です。
圧縮バッチ
次のプログラムをテキストエディタ等に貼り付け、「~.bat」など名前を付けて保存します。
@echo off
REM -----------------------------------------------------------------------------------------
REM 画像圧縮バッチ
REM -----------------------------------------------------------------------------------------
REM 概要:
REM 実行ファイルと同じディレクトリに存在する画像ファイル(PNG)を
REM 指定した比率で圧縮し、Exifなどの情報を削除します
REM 必須:
REM オープンソースソフトウェアの「pngquant」を利用します。
REM https://pngquant.org/
REM
REM -----------------------------------------------------------------------------------------
REM -------------------------------------------------
REM 変数
REM -------------------------------------------------
SET BATCHNAME=%~n0
SET YMD=%date:~-10,4%%date:~-5,2%%date:~-2,2%
SET LOGFILE=%CD%\log\%BATCHNAME%_%YMD%.log
REM * =========================================================================================================
REM * 処理開始
REM * =========================================================================================================
:LA_STARTBATCH
cls
ECHO =========================================================================================
ECHO 画像圧縮バッチ
ECHO.
ECHO -----------------------------------------------------------------------------------------
ECHO 実行ファイルと同じディレクトリに存在する画像ファイル(PNG)を圧縮します
ECHO.
ECHO =========================================================================================
ECHO.
SET DIRPATH=%CD%
ECHO.
SET /p seq=圧縮したファイルに付与する接頭語を入力(または [c] キャンセル)⇒
IF '%seq%'=='c' GOTO LA_ENDBATCH
REM コマンドチェック
IF '%seq%'=='' (
setlocal enabledelayedexpansion
SET /p confirm=接頭語を入力しない場合、元ファイルが上書きされますがよろしいですか?[ y / n ]⇒
CALL :LA_INPUT_CHECK !confirm! yn
IF '%confirm%'=='n' GOTO LA_CANCELL
)
SET PREFIX=%seq%
CD %DIRPATH%
ECHO [%DATE% %TIME%] バッチ処理開始 > %LOGFILE%
ECHO. >> %LOGFILE%
ECHO %DIRPATH% >> %LOGFILE%
ECHO %DIRPATH%にあるPNGファイルを圧縮します。 >> %LOGFILE%
ECHO. >> %LOGFILE%
ECHO.
ECHO %DIRPATH%
ECHO 上記ディレクトリ内にあるPNGファイルを圧縮します。
ECHO.
SET /p confirm=よろしいですか?[ y / n ]⇒
CALL :LA_INPUT_CHECK %confirm% yn
IF '%confirm%'=='n' GOTO LA_CANCELL
ECHO.
ECHO スタート!
setlocal enabledelayedexpansion
SET CNT=0
FOR /R %%A IN (*) DO (
REM 何故か FOR文で拡張子フィルターすると
REM 最後のファイルがダブルので別途拡張子を判定する
SET ISPNG=FALSE
IF '%%~xA'=='.png' SET ISPNG=TRUE
IF !ISPNG!==TRUE (
ECHO %%~nA
SET FILE=%%A
SET NFILE=%%~dpA!PREFIX!%%~nxA
IF NOT '%PREFIX%'=='' (
COPY /Y !FILE! !NFILE! > nul
SET FILE=!NFILE!
)
pngquant --speed 1 --ext .png --force !FILE! >> %LOGFILE%
)
)
ECHO コンプリート!
echo.
GOTO LA_ENDBATCH
EXIT /B
REM * =========================================================================================================
REM * コマンドチェック
REM * =========================================================================================================
:LA_INPUT_CHECK
ECHO %2 > tmp.text
SET RET=
FOR /F "usebackq" %%t IN (`findstr %1 tmp.text`) DO SET RET=%%t
DEL tmp.text
if '%RET%'=='' (
GOTO LA_INPUT_MISSING
)
EXIT /b
REM * =========================================================================================================
REM * エラー処理
REM * =========================================================================================================
:LA_ERROR
echo.
echo エラーが発生しました。
echo.
goto LA_ENDBATCH
REM * =========================================================================================================
REM * 処理中止
REM * =========================================================================================================
:LA_CANCELL
ECHO.
ECHO 処理は中止されました。
ECHO.
GOTO LA_ENDBATCH
REM * =========================================================================================================
REM * 入力ミス
REM * =========================================================================================================
:LA_INPUT_MISSING
ECHO.
SET /p miss=入力に誤りがあります。
GOTO LA_STARTBATCH
REM * =========================================================================================================
REM * バッチ終了処理
REM * =========================================================================================================
:LA_ENDBATCH
ECHO. >> %LOGFILE%
ECHO [%DATE% %TIME%] バッチ処理終了 >> %LOGFILE%
ECHO.
SET /p end=終了するにはEnterキーを押してください...
EXIT
まとめ
先日作ったバッチを修正して、拡張しを判定して処理をわけたりもできそうですね。
最近の記事からは画像をアップする前にリサイズや圧縮を行ってからやるようにしていて、
その効果もそのうち出てきてくれるといいなと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません