四方山話/ImageMagickを使った画像処理

Last-modified: 2016-02-19 (金) 13:15:56

ImageMagickのトピックも参照。

ImageMagickでのバッチ処理についてまとめたもの(文字コード変換にはNKFを使用)。吉里吉里/KAGでのゲーム制作で多用しそうなもの中心。

サムネイル画像の作成(サイズ指定)

ファイル名

thumbnail.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem ☆ここから…
  rem サムネイル画像の横幅(ピクセル)
  set THUMBNAILWIDTH=133
  rem サムネイル画像の縦幅(ピクセル)
  set THUMBNAILHEIGHT=99
  rem サムネイル画像ファイルのポストフィックス
  set POSTFIX=_s
rem ☆ここまでの値を変更のこと
rem 引数のチェック
if {%1}=={} (
  echo 機能概要:画像ファイルから%THUMBNAILWIDTH%×%THUMBNAILHEIGHT%のサムネイル画像(png)を作成する
  echo 使用法 :%~nx0 画像ファイル1 [画像ファイル2 ...]
  echo 備考  :既存のサムネイル画像ファイルは上書きされる
  goto :DONE
)
rem convert.exeのフルパス(NTFSに変換するconvert.exeもあるので紛らわしい…)
set IM_CONVERT="%IMAGE_MAGICK%convert.exe"
rem サムネイル画像を作成
for %%I in (%*) do (
  %IM_CONVERT% %%I -resize %THUMBNAILWIDTH%x%THUMBNAILHEIGHT% "%%~dpnI%POSTFIX%.png"
  if errorlevel 1 (
    echo エラー:サムネイル画像%%~dpnI%POSTFIX%.pngの作成に失敗
  ) else (
    echo 報告:サムネイル画像%%~dpnI%POSTFIX%.pngを作成
  )
)
:DONE
pause

使い方

  1. エクスプローラ上で画像ファイル(複数可)を選択する
  2. thumbnail.batにドラッグ&ドロップする
  3. 画像ファイルと同じフォルダにサムネイル画像(ファイル名の後ろに_sが付く)が作成される

サムネイル画像の作成(パーセンテージ指定)

ファイル名

thumbnail2.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem ☆ここから…
  rem パーセンテージ
  set PERCENT=20
  rem サムネイル画像ファイルのポストフィックス
  set POSTFIX=_s
rem ☆ここまでの値を変更のこと
rem 引数のチェック
if {%1}=={} (
  echo 機能概要:画像ファイルから%PERCENT%%のサムネイル画像(png)を作成する
  echo 使用法 :%~nx0 画像ファイル1 [画像ファイル2 ...]
  echo 備考  :既存のサムネイル画像ファイルは上書きされる
  goto :DONE
)
rem mogrify.exeのフルパス
set IM_MOGRIFY="%IMAGE_MAGICK%mogrify.exe"
rem サムネイル画像を作成
for %%I in (%*) do (
  copy /y %%I "%%~dpnI%POSTFIX%.png" > nul
  %IM_MOGRIFY% %%I -resize %PERCENT%%% "%%~dpnI%POSTFIX%.png"
  if errorlevel 1 (
    echo エラー:サムネイル画像%%~dpnI%POSTFIX%.pngの作成に失敗
    if exist "%%~dpnI%POSTFIX%.png" del "%%~dpnI%POSTFIX%.png"
  ) else (
    echo 報告:サムネイル画像%%~dpnI%POSTFIX%.pngを作成
  )
)
:DONE
pause

使い方

  1. エクスプローラ上で画像ファイル(複数可)を選択する
  2. thumbnail2.batにドラッグ&ドロップする
  3. 画像ファイルと同じフォルダにサムネイル画像(ファイル名の後ろに_sが付く)が作成される

横一列に連結(連結対象をまとめて指定)

ファイル名

connect.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem ☆ここから…
  rem 連結画像ファイルのポストフィックス
  set POSTFIX=_chained
rem ☆ここまでの値を変更のこと
rem 引数のチェック
if {%2}=={} (
  echo 機能概要:複数の画像ファイルを横一列に連結する
  echo 使用法 :%~nx0 画像ファイル1 画像ファイル2 [画像ファイル3 ...]
  echo 備考  :連結後の画像ファイル名(png)は 画像ファイル1 に %POSTFIX% を加えたもの
  goto :DONE
)
rem montage.exeのフルパス
set IM_MONTAGE="%IMAGE_MAGICK%montage.exe"
rem コマンドライン引数の数を調べる
set ARGC=0
for %%I in (%*) do set /a ARGC+=1
rem 画像ファイルを連結(背景が白になるため、-background transparentで背景を透過している)
%IM_MONTAGE% -background transparent -geometry +0+0 -tile %ARGC%x1 %* "%~dpn1%POSTFIX%.png"
if errorlevel 1 (
  echo エラー:連結画像%~dpn1%POSTFIX%.pngの作成に失敗
) else (
  echo 報告:連結画像%~dpn1%POSTFIX%.pngを作成
)
:DONE
pause

使い方

  1. エクスプローラ上で画像ファイル(複数可)を選択する
  2. connect.batにドラッグ&ドロップする
  3. 最初に指定した画像ファイルと同じフォルダに連結後の画像ファイル(ファイル名の後ろに_chainedが付く)が作成される

画像ファイルの選択の仕方などを間違えると、意図しない順番で連結されるので注意。

横一列に連結(連結対象を1つずつ指定)

ファイル名

connect2.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem montage.exeのフルパス
set IM_MONTAGE="%IMAGE_MAGICK%montage.exe"
set LIST=
set ARGC=0
rem 連結対象の画像ファイル名を1つずつ入力
:LOOP1
  set FILE=
  echo 連結対象のファイル名を入力し、Enterを押下してください(Enterのみで入力終了):
  set /p FILE=
  if not {%FILE%}=={} (
    set LIST=%LIST% %FILE%
    set /a ARGC+=1
    goto :LOOP1
  )
rem 入力された画像ファイルの数を調べる
if "%ARGC%"=="0" (
  echo エラー:連結対象画像ファイルが登録されていません(2つ以上必須)
  goto :LOOP1
)
if "%ARGC%"=="1" (
  echo エラー:登録された連結対象画像ファイルが少なすぎます(2つ以上必須)
  goto :LOOP1
)
rem 連結後の画像ファイル名を入力
:LOOP2
  echo 連結後の画像ファイル名(拡張子付き)を入力し、Enterを押下してください:
  set /p OUTPUT=
  if {%OUTPUT%}=={} goto :LOOP2
rem 連結後の画像ファイル名をチェック
for %%I in (%LIST%) do (
  if /i {%OUTPUT%}=={%%I} (
    echo エラー:連結後の画像ファイル名に連結対象画像ファイル名は使えません
    set OUTPUT=
    goto :LOOP2
  )
)
rem 画像ファイルを連結
%IM_MONTAGE% -geometry +0+0 -tile %ARGC%x1 %LIST% %OUTPUT%
if errorlevel 1 (
  echo エラー:連結画像%OUTPUT%の作成に失敗
) else (
  echo 報告:連結画像%OUTPUT%を作成
)
:DONE
pause

使い方

  1. エクスプローラからconnect2.batを実行する
  2. エクスプローラから連結したい画像ファイルを1つ選択
  3. (connect2.batの)コマンドプロンプトにドラッグ&ドロップし、Enterを押下する
  4. 連結したい画像ファイルの数だけ 2.~3. を繰り返す
  5. Enterを押下する
  6. 連結後の画像ファイル名を入力し、Enterを押下する
  7. 連結後の画像ファイルが作成される

任意の画像ファイルを重ね合わせる

ファイル名

composite.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem ☆ここから…
  rem 重ね合わせ位置
  rem 左上:northwest 上:north 右上:northeast 左:west 中央:center 右:east 左下:southwest 下:south 右下:southeast
  set POSISION=southeast
  rem X座標(ピクセル):値の前に + か - を付けること
  set LEFT=+10
  rem Y座標(ピクセル):値の前に + か - を付けること
  set TOP=+10
  rem 連結画像ファイルのポストフィックス
  set POSTFIX=_composite
rem ☆ここまでの値を変更のこと
rem 引数のチェック
if {%2}=={} (
  echo 機能概要:画像ファイル1に画像ファイル2を重ね合わせる
  echo 使用法 :%~nx0 画像ファイル1 画像ファイル2
  echo 備考  :合成後の画像ファイル名(png)は 画像ファイル1 に %POSTFIX% を加えたもの
  goto :DONE
)
rem convert.exeのフルパス(NTFSに変換するconvert.exeもあるので紛らわしい…)
set IM_CONVERT="%IMAGE_MAGICK%convert.exe"
rem 画像ファイルを合成
%IM_CONVERT% %1 %2 -gravity %POSISION% -geometry %LEFT%%TOP% -composite "%~dpn1%POSTFIX%.png"
if errorlevel 1 (
  echo エラー:合成画像%~dpn1%POSTFIX%.pngの作成に失敗
) else (
  echo 報告:合成画像%~dpn1%POSTFIX%.pngを作成
)
:DONE
pause

使い方

  1. エクスプローラ上で画像ファイルを2つ選択する(後に選択した側が重ね合わせる画像)
  2. composite.batにドラッグ&ドロップする
  3. 最初に指定した画像ファイルと同じフォルダに合成後の画像ファイル(ファイル名の後ろに_compositeが付く)が作成される

画像ファイルの選択の仕方などを間違えると、意図しない順番で連結されるので注意。

任意の文字列を描画

ファイル名

drawtext.bat

スクリプト

@echo off
rem im_subroutine.batを呼び出し環境変数IMAGE_MAGICK、NKFを設定
if exist "%~dp0im_subroutine.bat" call "%~dp0im_subroutine.bat"
rem ☆ここから…
  rem 重ね合わせ位置
  rem 左上:northwest 上:north 右上:northeast 左:west 中央:center 右:east 左下:southwest 下:south 右下:southeast
  set POSISION=south
  rem TrueTypeフォントファイル名
  set FONTFACE="%WINDIR%\fonts\msgothic.ttc"
  rem フォントサイズ(ポイント)
  set FONTSIZE=20
  rem フォントカラー:色名(white black red…)またはRGB値(#rrggbb)
  set FONTCOLOR=red
  rem 画像ファイルに描画する文字列
  set TEXT=吉里吉里 inside - turn your dreams on
  rem 文字列の角度(度)
  set ANGLE=0
  rem 文字列のX座標(ピクセル):値の前に + か - を付けること
  set LEFT=+0
  rem 文字列のY座標(ピクセル):値の前に + か - を付けること
  set TOP=-10
  rem 文字列描画後のファイルのポストフィックス
  set POSTFIX=_embed
rem ☆ここまでの値を変更のこと
rem 引数のチェック
if {%1}=={} (
  echo 機能概要:画像ファイルに文字列 %TEXT% を描画する
  echo 使用法 :%~nx0 画像ファイル1 [画像ファイル2 ...]
  echo 備考  :合成後の画像ファイル名(png)は 画像ファイル に %POSTFIX% を加えたもの
  goto :DONE
)
rem convert.exeのフルパス(NTFSに変換するconvert.exeもあるので紛らわしい…)
set IM_CONVERT="%IMAGE_MAGICK%convert.exe"
rem 文字列をUnicode(UTF-8 BOM無し)のテキストファイルに変換
echo %TEXT%>"%TEMP%\%~n0.txt"
"%NKF%nkf.exe" -w80 -Lw -O "%TEMP%\%~n0.txt" "%TEMP%\%~n0_utf8.txt"
rem 文字列を描画
for %%I in (%*) do (
  %IM_CONVERT% -gravity %POSISION% -font %FONTFACE% -pointsize %FONTSIZE% -annotate %ANGLE%x%ANGLE%%LEFT%%TOP% @"%TEMP%\%~n0_utf8.txt" -fill %FONTCOLOR% %%I "%%~dpnI%POSTFIX%.png"
  if errorlevel 1 (
    echo エラー:画像%%~dpnI%POSTFIX%.pngの作成に失敗
  ) else (
    echo 報告:画像%%~dpnI%POSTFIX%.pngを作成
  )
)
rem 後始末
if exist "%TEMP%\%~n0.txt" del "%TEMP%\%~n0.txt"
if exist "%TEMP%\%~n0_utf8.txt" del "%TEMP%\%~n0_utf8.txt"
:DONE
pause

使い方

  1. エクスプローラ上で画像ファイル(複数可)を選択する
  2. drawtext.batにドラッグ&ドロップする
  3. 画像ファイルと同じフォルダに文字列描画後の画像ファイル(ファイル名の後ろに_embedが付く)が作成される

共通サブルーチン

ファイル名

im_subroutine.bat

スクリプト

rem 共通サブルーチン:ImageMagick、NKFのインストール先フォルダを環境変数に設定する
rem ‐フォルダを指定する場合は、フォルダ名の末尾に \ を付けること(下のIMAGE_MAGICKの行を参照)
rem ‐フォルダを指定しない(パスが通っている)場合は、空にしておくこと(下のNKFの行を参照)
rem ‐フォルダ名をダブルクォーテーションで囲む必要はない
rem ☆ここから…
  rem ImageMagickのインストール先フォルダ
  set IMAGE_MAGICK=C:\Program Files\ImageMagick-6.5.5-Q16\
  rem nkfのインストール先フォルダ
  set NKF=
rem ☆ここまでの値を変更のこと

説明

上記バッチファイルからサブルーチンとして呼び出されているバッチファイル。環境変数IMAGE_MAGICKにImageMagickの、環境変数NKFにNKFのインストール先フォルダを設定する。このバッチファイルは上記バッチファイルと同じフォルダにコピーしてあること。

備考

  • いずれのバッチファイルもPNG形式ファイルを出力する
  • 各種パラメータを変更するには、各バッチファイル中の「☆ここから…」~「☆ここまでの値を変更のこと」で設定されている環境変数の値を変更すれば良い
  • テスト実績はImageMagick 6.5.5-8 Q16、NKF 2.0.9
    • インストール先フォルダが変わった場合、im_subroutine.batの変数IMAGE_MAGICK、NKFの値を修正のこと

ダウンロード

参考