ImageMagickを利用しても画像の圧縮ができたので試してみる

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

おはようございます。

以前、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 

まとめ

ブログに載せる画像のサイズを予め削るのに便利なツールができたかと思います。

ソフトウェアでも便利なものがありますが、
自力でバッチにすることで、自分で好きなようにカスタマイズできるのでいいですよね。

私自身はこのバッチを少し変更して、自分のブログに合ったサイズで固定処理できるようにしようかと思います。

ではでは。

 

スポンサーリンク


関連するコンテンツ