ImageMagickを利用しても画像の圧縮ができたので試してみる
おはようございます。
以前、ImageMagickではリサイズだけで、jpegoptimという別ツールにて圧縮する方法を試したのですが、
よくよく調べたところ ImageMagick でも圧縮する方法があったので試してみました。
※PNG画像は圧縮の指定が違うため今回は対象外としました。
スポンサーリンク
ImageMagickのインストール
ImageMagickのインストールなどは過去記事を参照してください
ImageMagickを利用した画像の一括リサイズバッチを作ってみた
jpegoptimを使って画像(JPEG)を一括圧縮するバッチを作ってみた
画像を圧縮してみる
試しに、画像を圧縮してみます。
元のサイズが 106KB 程の画像(test.jpg)を利用します。
コマンドプロンプトで、ファイルを保存したディレクトリに移動してから下記のコマンドを実行します。
magick convert -quality 50 test.jpg test_new.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=%CD%\log\%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 IF '%imode%'=='0' SET smode=自動で判別 IF '%imode%'=='1' SET smode=高さを基準とする IF '%imode%'=='2' SET smode=幅を基準とする 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 isize2=圧縮率(1 ~ 100)を入力(または [c] キャンセル)⇒ IF '%isize2%'=='c' GOTO LA_ENDBATCH IF '%isize2%'=='' GOTO LA_STARTBATCH REM 数値かどうかチェック SET /A check=%isize2%*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 spreifx=なし ) else ( SET spreifx=%seq% SET PREFIX=%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 /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 '%%~xA'=='.png' SET ISJPG=TRUE IF !ISJPG!==TRUE ( 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 縦幅 < 指定サイズ(変換しない) SET MODE=調整なし ) IF NOT '%%~xA'=='.png' magick convert -quality !isize2! %%~dpA!PREFIX!%%~nxA %%~dpA!PREFIX!%%~nxA ) else ( REM 縦幅 < 横幅 IF !WIDTH! GEQ !isize! ( REM 横幅 >= 指定サイズ magick convert -resize !isize!x %%A %%~dpA!PREFIX!%%~nxA SET MODE=幅を調整 ) else ( REM 横幅 < 指定サイズ(変換しない) SET MODE=調整なし ) IF NOT '%%~xA'=='.png' magick convert -quality !isize3! %%~dpA!PREFIX!%%~nxA %%~dpA!PREFIX!%%~nxA ) ) REM 高さ調整 IF '%imode%'=='1' ( IF !HEIGHT! GEQ !isize! ( REM 縦幅 >= 指定サイズ magick convert -resize x!isize! %%A %%~dpA!PREFIX!%%~nxA SET MODE=高さを調整 ) else ( REM 縦幅 < 指定サイズ(変換しない) SET MODE=調整なし ) IF NOT '%%~xA'=='.png' magick convert -quality !isize3! %%~dpA!PREFIX!%%~nxA %%~dpA!PREFIX!%%~nxA ) REM 幅調整 IF '%imode%'=='2' ( IF !WIDTH! GEQ !isize! ( REM 横幅 >= 指定サイズ magick convert -resize !isize!x %%A %%~dpA!PREFIX!%%~nxA SET MODE=幅を調整 ) else ( REM 横幅 < 指定サイズ(変換しない) SET MODE=調整なし ) IF NOT '%%~xA'=='.png' magick convert -quality !isize3! %%~dpA!PREFIX!%%~nxA %%~dpA!PREFIX!%%~nxA ) 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!](圧縮:!isize2!%%)ファイル:%%~nxA ECHO !MODE!:[!SHEIGHT!x!SWIDTH!] → [!SNHEIGHT!x!SNWIDTH!](圧縮:!isize2!%%)ファイル:%%~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
まとめ
ブログに載せる画像のサイズを予め削るのに便利なツールができたかと思います。
ソフトウェアでも便利なものがありますが、
自力でバッチにすることで、自分で好きなようにカスタマイズできるのでいいですよね。
私自身はこのバッチを少し変更して、自分のブログに合ったサイズで固定処理できるようにしようかと思います。
ではでは。
ディスカッション
コメント一覧
まだ、コメントがありません