【Windowsバッチ(.bat)】ImageMagickを使用し一発でフォルダ内の一枚絵すべてを3×4の歩行グラフィック形式にする

概要

2DのRPGなどを作っていて、モンスターの一枚絵を手に入れたのでこれから4方向ホコグラをつくるために1枚の絵を等倍で縦3横4個ずつ並べて結合したい瞬間はありませんか、今の私がまさにそれです。
毎回ペイントソフトで並べてたら人生がいくつあっても足りませんね、コマンド一発で終わらせてみましょう。

環境

Windows11

参考

ImageMagick で画像のフチの背景色を切り取って透明に - Qiita
例コマンドラインで背景色を取り除きたい。をな感じにしたい。※例えば、大量に白背景の画像を透明背景に変換しなくてはならない場合に便利。コマンドImageMagick を使う。conver…

やること

ImageMagickをインストールします。

ImageMagick – Mastering Digital Image Alchemy
ImageMagick is a free and open-source software suite used for editing and manipulating digital images. It provides a ver...

左上の「Download」から「Windows Binary Release」の適当なファイルをダウンロードしてインストールしてください。
今回は「ImageMagick-7.1.1-22-Q16-HDRI-x64-dll.exe」をインストールしました。

一枚ずつコマンドで結合する

今回はこういう画像を用意して「image.png」という名前で保存します。

cdコマンドか、対象の画像があるフォルダまで移動して現在地が出てくるバーで「cmd」と入力するとコマンドプロンプトが出てきます。
コマンドプロントが出てきたら下記のコマンドを実行します。

magick montage -tile 3x4 -geometry +0+0 image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png image.png result.png

すると、「result.png」という名前で下記のような結合画像が生成されます。

まとめてバッチで結合する

magick montage -tileのコマンドでは、結合したい分の画像名をファイル名を書かないといけないのですが、毎回12個もファイル名を打つのはとてもだるいのでバッチで自動化します。
下記のコードをテキストファイルにコピーして拡張子を「.bat」とし、変換したい画像が入っているフォルダにいれて実行してください。

画像名に半角スペースがあるとダブルクォーテーションでくくっても動かないので、「 」を「_」にファイル名に書き換える処理が入っています。あしからず。
キャラチップに使うので透過処理も入っています。アルファ値などで半透明になっている部分はうまく透過できません、何かいい方法ないかな…。
「-geometry +1+1」で縦横1ピクセル開けて結合し、線で閉じられていない部分の背景色を透過しています。

@echo off
setlocal enabledelayedexpansion

rem 画像ファイルの拡張子のリスト
set "EXTENSIONS=.png"

rem カレントフォルダ内の画像ファイルを結合
for %%i in (%EXTENSIONS%) do (
    for %%f in (*%%i) do (
        rem 半角スペースをアンダースコアに置き換え
        set "filename=%%f"
        set "new_filename=!filename: =_!"
        rem ファイル名を書き換え
        ren "%%f" "!new_filename!"

        rem ファイル結合
        echo Processing: !new_filename!
        magick montage -tile 3x4 -geometry +1+1 !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! !new_filename! chara_!new_filename!

        rem 透過処理
	magick chara_!new_filename! -alpha set -background none -channel RGBA -fill "#00000000" -fuzz 5% -draw "alpha 1,1 floodfill" chara_!new_filename!
    )
)

endlocal
pause

おわり。