ImageMagickを利用しても画像の圧縮ができたので試してみる
おはようございます。
以前、ImageMagickではリサイズだけで、jpegoptimという別ツールにて圧縮する方法を試したのですが、
よくよく調べたところ ImageMagick でも圧縮する方法があったので試してみました。
※PNG画像は圧縮の指定が違うため今回は対象外としました。
スポンサーリンク
ImageMagickのインストール
ImageMagickのインストールなどは過去記事を参照してください
ImageMagickを利用した画像の一括リサイズバッチを作ってみた
jpegoptimを使って画像(JPEG)を一括圧縮するバッチを作ってみた
画像を圧縮してみる
試しに、画像を圧縮してみます。
元のサイズが 106KB 程の画像(test.jpg)を利用します。
コマンドプロンプトで、ファイルを保存したディレクトリに移動してから下記のコマンドを実行します。
1 | magickconvert -quality50test.jpgtest_new.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 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | @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=%CD%\log\%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 IF'%imode%'=='0'SETsmode=自動で判別 IF'%imode%'=='1'SETsmode=高さを基準とする IF'%imode%'=='2'SETsmode=幅を基準とする 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/pisize2=圧縮率(1~100)を入力(または[c]キャンセル)⇒ IF'%isize2%'=='c'GOTOLA_ENDBATCH IF'%isize2%'==''GOTOLA_STARTBATCH REM 数値かどうかチェック SET/Acheck=%isize2%*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 SETspreifx=なし )else( SETspreifx=%seq% SETPREFIX=%seq% ) CD%DIRPATH% ECHO [%DATE% %TIME%] バッチ処理開始 > %LOGFILE% ECHO. >> %LOGFILE% ECHO %DIRPATH% >> %LOGFILE% ECHO %DIRPATH%にあるファイルを、指定したサイズ(%isize%)、圧縮率(%isize2%)にリサイズします。 >> %LOGFILE% ECHO. >> %LOGFILE% ECHO. ECHO ----------------------------------------------------------------------------------------- ECHO パ ス:%DIRPATH% ECHO 接頭語:%spreifx% ECHO モード:%smode% ECHO サイズ:%isize%px ECHO 圧縮率:%isize2%%% ECHO ----------------------------------------------------------------------------------------- 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( REM何故かFOR文で拡張子フィルターすると REM最後のファイルがダブルので別途拡張子を判定する SETISJPG=FALSE IF'%%~xA'=='.jpg'SET ISJPG=TRUE IF'%%~xA'=='.jpeg'SETISJPG=TRUE IF'%%~xA'=='.png'SETISJPG=TRUE IF!ISJPG!==TRUE( 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縦幅<指定サイズ(変換しない) SETMODE=調整なし ) IFNOT'%%~xA'=='.png'magickconvert -quality!isize2!%%~dpA!PREFIX!%%~nxA%%~dpA!PREFIX!%%~nxA )else( REM縦幅<横幅 IF!WIDTH!GEQ!isize!( REM横幅>=指定サイズ magickconvert -resize!isize!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=幅を調整 )else( REM横幅<指定サイズ(変換しない) SETMODE=調整なし ) IFNOT'%%~xA'=='.png'magickconvert -quality!isize3!%%~dpA!PREFIX!%%~nxA%%~dpA!PREFIX!%%~nxA ) ) REM高さ調整 IF'%imode%'=='1'( IF!HEIGHT!GEQ!isize!( REM縦幅>=指定サイズ magickconvert -resizex!isize!%%A%%~dpA!PREFIX!%%~nxA SETMODE=高さを調整 )else( REM縦幅<指定サイズ(変換しない) SETMODE=調整なし ) IFNOT'%%~xA'=='.png'magickconvert -quality!isize3!%%~dpA!PREFIX!%%~nxA%%~dpA!PREFIX!%%~nxA ) REM幅調整 IF'%imode%'=='2'( IF!WIDTH!GEQ!isize!( REM横幅>=指定サイズ magickconvert -resize!isize!x%%A%%~dpA!PREFIX!%%~nxA SETMODE=幅を調整 )else( REM横幅<指定サイズ(変換しない) SETMODE=調整なし ) IFNOT'%%~xA'=='.png'magickconvert -quality!isize3!%%~dpA!PREFIX!%%~nxA%%~dpA!PREFIX!%%~nxA ) 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!](圧縮:!isize2!%%)ファイル:%%~nxA ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!](圧縮:!isize2!%%)ファイル:%%~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 |
まとめ
ブログに載せる画像のサイズを予め削るのに便利なツールができたかと思います。
ソフトウェアでも便利なものがありますが、
自力でバッチにすることで、自分で好きなようにカスタマイズできるのでいいですよね。
私自身はこのバッチを少し変更して、自分のブログに合ったサイズで固定処理できるようにしようかと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません