ImageMagickを利用した画像の一括リサイズバッチを作ってみた

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

おはようございます。

昨日に引き続きブログ運営にかかわる話。

ページの表示速度が遅くなる原因のひとつに
画像のデータサイズが大きすぎるということが挙げられます。

なのでまずは、
画像を適切な高さと幅にリサイズして容量を減らそうと思ったのですが、
1つ1つの画像に対して作業してくのは効率が悪いですよね。

ということでバッチを作りました。

Windowsの標準機能でコマンドラインからリサイズする方法がなさそうなので、
ImageMagickというオープンソースのソフトウェアを利用しました。

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

スポンサーリンク

ダウンロード

ダウンロードページ

ダウンロードページ

Downloadリンクをクリックしてダウンロードします。

インストール

ダウンロードした exe を起動

ライセンス同意画面

ライセンス同意画面が表示されるので、「I accept the agreement」にチェックして「Next」ボタンをクリックします。

セットアップ開始画面

セットアップ開始画面が表示されるので「Next」ボタンをクリックします。

インストール先指定画面

インストール先指定画面が表示されるので、変更する必要がなければそのまま「Next」ボタンをクリックします。

メニューフォルダ指定

メニューフォルダ指定画面が表示されるので、変更する必要がなければそのまま「Next」ボタンをクリックします。

追加タスク指定

追加タスク指定画面が表示されるので、特に必要がなければそのまま「Next」ボタンをクリックします。

インストール準備完了画面

インストール準備完了画面が表示されるので「Install」ボタンをクリックします。

重要な情報画面

重要な情報画面が表示されるので「Next」ボタンをクリックします。

インストール完了画面

インストール完了画面が表示されるので、「Finish」ボタンをクリックします。

コマンドの確認

インストール時に実行ファイルへのパスが自動で登録されるため、特に何もしなくても、すぐにコマンドを実行することができます。ので、念のため確認作業を。

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

magick -version
バージョン情報

上記のようにバージョン情報が表示されればOKです。

画像をリサイズしてみる

試しに画像をリサイズしてみます。
元のサイズが 1920×1280 とやや大きめの画像を、幅780にしてみます。

画像のプロパティ

コマンドプロンプトで、
ファイルがあるフォルダに移動して次のコマンドを実行

magick convert keyboard1920x1280.jpg -resize 780x keyboard780x520.jpg
リサイズ実行
リサイズ後の画像プロパティ

無事にリサイズされました。

リサイズバッチを作った

バッチと同じディレクトリに存在する画像ファイルを指定したサイズでリサイズをします。

※縦長であれば高さ、横長であれば幅を基準にリサイズします。
※指定したサイズより小さい画像についてはリサイズを実施しません。

@echo off
REM -----------------------------------------------------------------------------------------
REM 画像ファイルリサイズバッチ
REM -----------------------------------------------------------------------------------------
REM 概要: 
REM       実行ファイルと同じディレクトリに存在する画像ファイルのサイズを
REM       縦横比を保持した状態で指定した高さまたは幅にリサイズします
REM 必須: 
REM       オープンソースソフトウェアの「ImageMagick」を利用します。
REM       http://imagemagick.org/script/download.php
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  実行ファイルと同じディレクトリに存在する画像ファイルのサイズを
ECHO  縦横比を保持した状態で指定した高さまたは幅にリサイズします
ECHO.
ECHO  ※指定サイズは縦長画像であれば高さ、横長画像であれば幅に適用されます
ECHO.
ECHO =========================================================================================
ECHO.
SET DIRPATH=%CD%

ECHO.
SET /p imode=モード選択([0]自動/[1]縦/[2]横/または [c] キャンセル)⇒
IF '%imode%'=='c' GOTO LA_ENDBATCH
IF '%imode%'=='' GOTO LA_STARTBATCH

ECHO.
SET /p isize=新しいサイズを入力(または [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 (
	SET NM=%%~nA
	IF NOT '%%~xA'=='.log' (
		IF NOT '%%~nA'=='%BATCHNAME%' (
			
			REM 画像の縦幅を取得
			FOR /f "usebackq tokens=*" %%i in (`magick identify -format %%h %%A`) do @set HEIGHT=%%i
			
			REM 画像の横幅を取得
			FOR /f "usebackq tokens=*" %%i in (`magick identify -format %%w %%A`) do @set WIDTH=%%i
			
			REM 自動調整
			IF '%imode%'=='0' (
				REM リサイズ
				SET MODE=
				REM ECHO 高さ:!HEIGHT!/幅:!WIDTH!/指定:!isize! >> %LOGFILE%
				IF !HEIGHT! GEQ !WIDTH! (
					REM 縦幅 >= 横幅
					IF !HEIGHT! GEQ !isize! (
						REM 縦幅 >= 指定サイズ
						magick convert -resize x!isize! %%A %%~dpA!PREFIX!%%~nxA
						SET MODE=高さを調整
					) else (
						REM 縦幅 < 指定サイズ(変換しない)
						magick convert -resize x!HEIGHT! %%A %%~dpA!PREFIX!%%~nxA
						SET MODE=調整なし
					)
					
				) else (
					REM 縦幅 < 横幅
					IF !WIDTH! GEQ !isize! (
						REM 横幅 >= 指定サイズ
						magick convert -resize !isize!x %%A %%~dpA!PREFIX!%%~nxA
						SET MODE=幅を調整
					) else (
						REM 横幅 < 指定サイズ(変換しない)
						magick convert -resize !WIDTH!x %%A %%~dpA!PREFIX!%%~nxA
						SET MODE=調整なし
					)
				)
			)
			REM 高さ調整
			IF '%imode%'=='1' (
				IF !HEIGHT! GEQ !isize! (
					REM 縦幅 >= 指定サイズ
					magick convert -resize x!isize! %%A %%~dpA!PREFIX!%%~nxA
					SET MODE=高さを調整
				) else (
					REM 縦幅 < 指定サイズ(変換しない)
					magick convert -resize x!HEIGHT! %%A %%~dpA!PREFIX!%%~nxA
					SET MODE=調整なし
				)
			)
			REM 幅調整
			IF '%imode%'=='2' (
				IF !WIDTH! GEQ !isize! (
					REM 横幅 >= 指定サイズ
					magick convert -resize !isize!x %%A %%~dpA!PREFIX!%%~nxA
					SET MODE=幅を調整
				) else (
					REM 横幅 < 指定サイズ(変換しない)
					magick convert -resize !WIDTH!x %%A %%~dpA!PREFIX!%%~nxA
					SET MODE=調整なし
				)
			)
			
			REM 変更後画像の縦幅を取得
			FOR /f "usebackq tokens=*" %%i in (`magick identify -format %%h %%~dpA!PREFIX!%%~nxA`) do @set NHEIGHT=%%i
			
			REM 変更後画像の横幅を取得
			FOR /f "usebackq tokens=*" %%i in (`magick identify -format %%w %%~dpA!PREFIX!%%~nxA`) do @set NWIDTH=%%i
			
			REM 出力を整形
			IF !HEIGHT! GEQ 1000 (SET SHEIGHT=!HEIGHT!) ELSE (SET SHEIGHT= !HEIGHT!)
			IF !WIDTH! GEQ 1000 (SET SWIDTH=!WIDTH!) ELSE (SET SWIDTH= !WIDTH!)
			IF !NHEIGHT! GEQ 1000 (SET SNHEIGHT=!NHEIGHT!) ELSE (SET SNHEIGHT= !NHEIGHT!)
			IF !NWIDTH! GEQ 1000 (SET SNWIDTH=!NWIDTH!) ELSE (SET SNWIDTH= !NWIDTH!)
			
			ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!] ファイル:%%~nxA
			ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!] ファイル:%%~nxA >> %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 

まとめ

ひとまずこれで、
ブログに載せる画像をアップロードする前に
バッチを使ってサクッとリサイズできるようになりました。

次回は一括で圧縮するバッチを作ってみようと思います。

ではでは。

スポンサーリンク


関連するコンテンツ