ImageMagickを利用した画像の一括リサイズバッチを作ってみた
おはようございます。
昨日に引き続きブログ運営にかかわる話。
ページの表示速度が遅くなる原因のひとつに
画像のデータサイズが大きすぎるということが挙げられます。
なのでまずは、
画像を適切な高さと幅にリサイズして容量を減らそうと思ったのですが、
1つ1つの画像に対して作業してくのは効率が悪いですよね。
ということでバッチを作りました。
Windowsの標準機能でコマンドラインからリサイズする方法がなさそうなので、
ImageMagickというオープンソースのソフトウェアを利用しました。
ImageMagickのインストールからバッチの実行までを説明します。
スポンサーリンク
ダウンロード
Downloadリンクをクリックしてダウンロードします。
インストール
ダウンロードした exe を起動
ライセンス同意画面が表示されるので、「I accept the agreement」にチェックして「Next」ボタンをクリックします。
セットアップ開始画面が表示されるので「Next」ボタンをクリックします。
インストール先指定画面が表示されるので、変更する必要がなければそのまま「Next」ボタンをクリックします。
メニューフォルダ指定画面が表示されるので、変更する必要がなければそのまま「Next」ボタンをクリックします。
追加タスク指定画面が表示されるので、特に必要がなければそのまま「Next」ボタンをクリックします。
インストール準備完了画面が表示されるので「Install」ボタンをクリックします。
重要な情報画面が表示されるので「Next」ボタンをクリックします。
インストール完了画面が表示されるので、「Finish」ボタンをクリックします。
コマンドの確認
インストール時に実行ファイルへのパスが自動で登録されるため、特に何もしなくても、すぐにコマンドを実行することができます。ので、念のため確認作業を。
コマンドプロンプトを起動して、次のコマンドを実行します。
1 | magick -version |
上記のようにバージョン情報が表示されればOKです。
画像をリサイズしてみる
試しに画像をリサイズしてみます。
元のサイズが 1920×1280 とやや大きめの画像を、幅780にしてみます。
コマンドプロンプトで、
ファイルがあるフォルダに移動して次のコマンドを実行
1 | magickconvertkeyboard1920x1280.jpg -resize780xkeyboard780x520.jpg |
無事にリサイズされました。
リサイズバッチを作った
バッチと同じディレクトリに存在する画像ファイルを指定したサイズでリサイズをします。
※縦長であれば高さ、横長であれば幅を基準にリサイズします。
※指定したサイズより小さい画像についてはリサイズを実施しません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 | @echo off REM ----------------------------------------------------------------------------------------- REM 画像ファイルリサイズバッチ REM ----------------------------------------------------------------------------------------- REM 概要: REM 実行ファイルと同じディレクトリに存在する画像ファイルのサイズを REM 縦横比を保持した状態で指定した高さまたは幅にリサイズします REM 必須: REM オープンソースソフトウェアの「ImageMagick」を利用します。 REM http://imagemagick.org/script/download.php REM REM ----------------------------------------------------------------------------------------- REM ------------------------------------------------- REM 変数 REM ------------------------------------------------- SETBATCHNAME=%~n0 SETYMD=%date:~-10,4%%date:~-5,2%%date:~-2,2% SETLOGFILE=%BATCHNAME%_%YMD%.log REM * ========================================================================================================= REM * 処理開始 REM * ========================================================================================================= :LA_STARTBATCH cls ECHO ========================================================================================= ECHO 画像ファイルリサイズバッチ ECHO. ECHO ----------------------------------------------------------------------------------------- ECHO 実行ファイルと同じディレクトリに存在する画像ファイルのサイズを ECHO 縦横比を保持した状態で指定した高さまたは幅にリサイズします ECHO. ECHO ※指定サイズは縦長画像であれば高さ、横長画像であれば幅に適用されます ECHO. ECHO ========================================================================================= ECHO. SETDIRPATH=%CD% ECHO. SET/pimode=モード選択([0]自動/[1]縦/[2]横/または[c]キャンセル)⇒ IF'%imode%'=='c'GOTOLA_ENDBATCH IF'%imode%'==''GOTOLA_STARTBATCH ECHO. SET/pisize=新しいサイズを入力(または[c]キャンセル)⇒ IF'%isize%'=='c'GOTOLA_ENDBATCH IF'%isize%'==''GOTOLA_STARTBATCH REM 数値かどうかチェック SET/Acheck=%isize%*1 IF%check%==0( GOTOLA_INPUT_MISSING ) ECHO. SET/pseq=リサイズしたファイルに付与する接頭語を入力(または[c]キャンセル)⇒ IF'%seq%'=='c'GOTOLA_ENDBATCH REM コマンドチェック IF'%seq%'==''( setlocalenabledelayedexpansion SET/pconfirm=接頭語を入力しない場合、元ファイルが上書きされますがよろしいですか?[y/n]⇒ CALL:LA_INPUT_CHECK!confirm!yn IF'%confirm%'=='n'GOTOLA_CANCELL ) SETPREFIX=%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/pconfirm=よろしいですか?[y/n]⇒ CALL:LA_INPUT_CHECK%confirm%yn IF'%confirm%'=='n'GOTOLA_CANCELL ECHO. ECHO スタート! setlocalenabledelayedexpansion SETCNT=0 FOR/R%%AIN(*)DO( SETNM=%%~nA IFNOT'%%~xA'=='.log'( IFNOT'%%~nA'=='%BATCHNAME%'( REM画像の縦幅を取得 FOR/f"usebackq tokens=*"%%iin(`magickidentify -format%%h%%A`)do@setHEIGHT=%%i REM画像の横幅を取得 FOR/f"usebackq tokens=*"%%iin(`magickidentify -format%%w%%A`)do@setWIDTH=%%i REM自動調整 IF'%imode%'=='0'( REMリサイズ SETMODE= REMECHO 高さ:!HEIGHT!/幅:!WIDTH!/指定:!isize! >> %LOGFILE% IF!HEIGHT!GEQ!WIDTH!( REM縦幅>=横幅 IF!HEIGHT!GEQ!isize!( REM縦幅>=指定サイズ magickconvert -resizex!isize!%%A%%~dpA!PREFIX!%%~nxA SETMODE=高さを調整 )else( REM縦幅<指定サイズ(変換しない) magickconvert -resizex!HEIGHT!%%A%%~dpA!PREFIX!%%~nxA SETMODE=調整なし ) )else( REM縦幅<横幅 IF!WIDTH!GEQ!isize!( REM横幅>=指定サイズ magickconvert -resize!isize!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=幅を調整 )else( REM横幅<指定サイズ(変換しない) magickconvert -resize!WIDTH!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=調整なし ) ) ) REM高さ調整 IF'%imode%'=='1'( IF!HEIGHT!GEQ!isize!( REM縦幅>=指定サイズ magickconvert -resizex!isize!%%A%%~dpA!PREFIX!%%~nxA SETMODE=高さを調整 )else( REM縦幅<指定サイズ(変換しない) magickconvert -resizex!HEIGHT!%%A%%~dpA!PREFIX!%%~nxA SETMODE=調整なし ) ) REM幅調整 IF'%imode%'=='2'( IF!WIDTH!GEQ!isize!( REM横幅>=指定サイズ magickconvert -resize!isize!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=幅を調整 )else( REM横幅<指定サイズ(変換しない) magickconvert -resize!WIDTH!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=調整なし ) ) REM変更後画像の縦幅を取得 FOR/f"usebackq tokens=*"%%iin(`magickidentify -format%%h%%~dpA!PREFIX!%%~nxA`)do@setNHEIGHT=%%i REM変更後画像の横幅を取得 FOR/f"usebackq tokens=*"%%iin(`magickidentify -format%%w%%~dpA!PREFIX!%%~nxA`)do@setNWIDTH=%%i REM出力を整形 IF!HEIGHT!GEQ1000(SETSHEIGHT=!HEIGHT!)ELSE(SETSHEIGHT=!HEIGHT!) IF!WIDTH!GEQ1000(SETSWIDTH=!WIDTH!)ELSE(SETSWIDTH=!WIDTH!) IF!NHEIGHT!GEQ1000(SETSNHEIGHT=!NHEIGHT!)ELSE(SETSNHEIGHT=!NHEIGHT!) IF!NWIDTH!GEQ1000(SETSNWIDTH=!NWIDTH!)ELSE(SETSNWIDTH=!NWIDTH!) ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!] ファイル:%%~nxA ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!] ファイル:%%~nxA >> %LOGFILE% ) ) ) ECHO コンプリート! echo. GOTOLA_ENDBATCH EXIT/B REM * ========================================================================================================= REM * コマンドチェック REM * ========================================================================================================= :LA_INPUT_CHECK ECHO %2 > tmp.text SETRET= FOR/F"usebackq"%%tIN(`findstr%1tmp.text`)DOSETRET=%%t DELtmp.text if'%RET%'==''( GOTOLA_INPUT_MISSING ) EXIT/b REM * ========================================================================================================= REM * エラー処理 REM * ========================================================================================================= :LA_ERROR echo. echo エラーが発生しました。 echo. gotoLA_ENDBATCH REM * ========================================================================================================= REM * 処理中止 REM * ========================================================================================================= :LA_CANCELL ECHO. ECHO 処理は中止されました。 ECHO. GOTOLA_ENDBATCH REM * ========================================================================================================= REM * 入力ミス REM * ========================================================================================================= :LA_INPUT_MISSING ECHO. SET/pmiss=入力に誤りがあります。 GOTOLA_STARTBATCH REM * ========================================================================================================= REM * バッチ終了処理 REM * ========================================================================================================= :LA_ENDBATCH ECHO. >> %LOGFILE% ECHO [%DATE% %TIME%] バッチ処理終了 >> %LOGFILE% ECHO. SET/pend=終了するにはEnterキーを押してください... EXIT |
まとめ
ひとまずこれで、
ブログに載せる画像をアップロードする前に
バッチを使ってサクッとリサイズできるようになりました。
次回は一括で圧縮するバッチを作ってみようと思います。
ではでは。
ディスカッション
コメント一覧
こんにちは。
地図タイル画像の大量のpngを一括でグレースケール化したいと考えておりようやくImageMagickにたどりつきました。(コマンドラインにはそもそも不慣れな者です)ImageMagickはバージョンによってコマンドが違うので新しいヴァージョンでの解説ありがたいです。
今回は当該フォルダ内のファイル操作ですが、下位フォルダの下位フォルダも探索するようにするにはどう書いたらいいか、もしよかったらご教授下さい。
よろしくお願いいたします。
miya様
ブログを見ていただきありがとうございます。
ご質問の件、記事に載せているバッチ処理ですが、
サブフォルダも対象になっているかと思います。
ご確認ください。
宜しくお願いします。