ImageMagickを利用した画像の一括リサイズバッチを作ってみた
おはようございます。
昨日に引き続きブログ運営にかかわる話。
ページの表示速度が遅くなる原因のひとつに
画像のデータサイズが大きすぎるということが挙げられます。
なのでまずは、
画像を適切な高さと幅にリサイズして容量を減らそうと思ったのですが、
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
まとめ
ひとまずこれで、
ブログに載せる画像をアップロードする前に
バッチを使ってサクッとリサイズできるようになりました。
次回は一括で圧縮するバッチを作ってみようと思います。
ではでは。
ディスカッション
コメント一覧
こんにちは。
地図タイル画像の大量のpngを一括でグレースケール化したいと考えておりようやくImageMagickにたどりつきました。(コマンドラインにはそもそも不慣れな者です)ImageMagickはバージョンによってコマンドが違うので新しいヴァージョンでの解説ありがたいです。
今回は当該フォルダ内のファイル操作ですが、下位フォルダの下位フォルダも探索するようにするにはどう書いたらいいか、もしよかったらご教授下さい。
よろしくお願いいたします。
miya様
ブログを見ていただきありがとうございます。
ご質問の件、記事に載せているバッチ処理ですが、
サブフォルダも対象になっているかと思います。
ご確認ください。
宜しくお願いします。