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

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

おはようございます。

昨日の今日ですが、
早速画像を一括で圧縮するバッチを作ってみたので公開します。

今回は、
jpegoptim というオープンソースソフトウェアを利用しました。

jpegoptim のインストールからバッチまでを説明します。

スポンサーリンク

ダウンロード

ダウンロードページ

ダウンロードページ

Downloadボタンをクリックしてファイルをダウンロードします。

インストール

ダウンロードした圧縮ファイルを展開し、任意の場所に格納します。
今回は「D:\Software\jpegoptim-1.3.0-win32-binary」としました。

環境変数の設定

exeが存在するディレクトリ以外でも実行できるように環境変数にパスを追加します。

[ Win ] + [ Break ] 、またはエクスプローラーなどで、PCのプロパティを開きます。

システム画面

「システムの詳細設定」メニューを選択します。

システムのプロパティ

「詳細設定」タブの「環境変数」ボタンをクリックします。

環境変数設定ダイアログ

「システム環境変数」の「Path」を選択して「編集」ボタンをクリックします。

環境変数の編集

「新規」ボタンをクリック、表示された入力画面で、先ほど jpegoptim を格納したディレクトリを設定、「OK」ボタンをクリックします。

確認

コマンドプロンプトを起動し、次のコマンドを実行します。

jpegoptim -V
バージョンコマンド

上記のように表示されれば、インストール完了です。

圧縮バッチを作った

バッチと同じディレクトリに存在する画像(JPEG)を指定した比率で圧縮し、Exifなどの情報も削除します。

@echo off
REM -----------------------------------------------------------------------------------------
REM 画像圧縮バッチ
REM -----------------------------------------------------------------------------------------
REM 概要: 
REM       実行ファイルと同じディレクトリに存在する画像ファイル(JPG)を
REM       指定した比率で圧縮し、Exifなどの情報を削除します
REM 必須: 
REM       オープンソースソフトウェアの「jpegoptim」を利用します。
REM       https://sourceforge.net/projects/jpegoptim/
REM 
REM -----------------------------------------------------------------------------------------
REM -------------------------------------------------
REM 変数
REM -------------------------------------------------
SET BATCHNAME=%~n0
SET YMD=%date:~-10,4%%date:~-5,2%%date:~-2,2%
SET LOGFILE=%BATCHNAME%_%YMD%.log

REM * =========================================================================================================
REM * 処理開始
REM * =========================================================================================================
:LA_STARTBATCH

cls
ECHO =========================================================================================
ECHO  画像圧縮バッチ
ECHO.
ECHO -----------------------------------------------------------------------------------------
ECHO  実行ファイルと同じディレクトリに存在する画像ファイル(JPG)を
ECHO  指定した比率で圧縮し、Exifなどの情報を削除します
ECHO.
ECHO =========================================================================================
ECHO.
SET DIRPATH=%CD%

ECHO.
SET /p isize=比率(1 ~ 100)を入力(または [c] キャンセル)⇒
IF '%isize%'=='c' GOTO LA_ENDBATCH
IF '%isize%'=='' GOTO LA_STARTBATCH

REM 数値かどうかチェック
SET /A check=%isize%*1
IF %check% == 0 (
GOTO LA_INPUT_MISSING
)

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%にあるファイルを、指定した比率(%isize%)で圧縮します。 >> %LOGFILE%
ECHO. >> %LOGFILE%

ECHO.
ECHO %DIRPATH%
ECHO 上記ディレクトリ内にあるファイルを指定した比率(%isize%)で圧縮します。
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 ISJPG=FALSE
	IF '%%~xA'=='.jpg' SET  ISJPG=TRUE
	IF '%%~xA'=='.jpeg' SET ISJPG=TRUE
	
	IF !ISJPG!==TRUE (
		ECHO %%~nA
		SET FILE=%%A
		SET NFILE=%%~dpA!PREFIX!%%~nxA
		IF NOT '%PREFIX%'=='' (
			COPY /Y !FILE! !NFILE! > nul
			SET FILE=!NFILE!
		)
		
		jpegoptim --strip-all --max=!isize! !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 

まとめ

WEBサービスの「compressjpeg」と、同じ圧縮率で比較してみたところ、
バッチの方がややサイズが大きいとう結果になりました。

が、手間を考えるとバッチの方が上ですし、
ケースによって使い分けていこうかと思います。

色々と作ってみているなかで、
やっぱりファイルのリネーム、リサイズ、圧縮なんかを1つのバッチで出来た方が便利だなと感じたので
それも作ってみようかと思います。

ではでは。

 

スポンサーリンク


関連するコンテンツ