pngquant を使って画像(PNG)を一括圧縮するバッチを作ってみた

Windows DOS,ソフトウェア,ブログ運営,開発

おはようございます。

先日、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 

まとめ

先日作ったバッチを修正して、拡張しを判定して処理をわけたりもできそうですね。

最近の記事からは画像をアップする前にリサイズや圧縮を行ってからやるようにしていて、
その効果もそのうち出てきてくれるといいなと思います。

ではでは。

スポンサーリンク


関連するコンテンツ