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
まとめ
先日作ったバッチを修正して、拡張しを判定して処理をわけたりもできそうですね。
最近の記事からは画像をアップする前にリサイズや圧縮を行ってからやるようにしていて、
その効果もそのうち出てきてくれるといいなと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません