ImageMagickを使って画像をタイルに分割したり結合したりする方法

ImageMagickを使ってコマンドラインから画像をタイル分割したり結合したりする方法の紹介です。ドット絵のマップチップを分割・結合したい時などで便利です。

タイルに分割

1枚の画像をタイル分割したい場合は-cropオプションを使って次のようにします。

$ convert -crop 100x100 source.png tile-%d.png
$ ls
source.png tile-0.png tile-11.png tile-2.png tile-4.png tile-6.png tile-8.png
tile-10.png tile-1.png tile-3.png tile-5.png tile-7.png tile-9.png

100x100は分割したいタイルのサイズです。分割後のファイルを001002003のように番号付けしたい場合は%dの代わりに%03dを使ってみてください。

分割したタイルを結合

分割したタイルを1枚の画像に戻したい場合は-tileオプションを使って次のようにします。

$ montage -tile 4x3 -geometry +0+0 tile-*.png result.png

4x3の部分がタイルを縦横に何枚並べるかを設定している部分です。

※アルファチャンネルの情報が消えてしまう場合は-background noneのオプションを試してみてください。

Windows版のImageMagick

ImageMagickは主にLinux系のシステムで使われている画像編集ツールですがWindows版のexeもあります。(リンクを参照してください。)

Windows版のImageMagickを使う場合はconvertmontageの前にmagick.exeを追加したコマンドを使います。

magick.exe convert -crop 100x100 source.png tile-%d.png
magick.exe montage -tile 4x3 -geometry +0+0 tile-*.png result.png

リンク

ImageMagick – Download
https://imagemagick.org/script/download.php

C#で配列のサイズを調べる方法

配列のサイズを調べる方法

Lengthを使って配列のサイズを調べることができます。

int[] array1 = new int[]{ 1, 2, 3, 4, 5 };

Debug.Log($"Length = {array1.Length}");

実行結果

Length = 5

ジャグ配列の場合

int[][] array2 = new int[][]{
  new int[] { 1, 2, 3 },
  new int[] { 4, 5, 6, 7 }
};

Debug.Log($"Length = {array2.Length}");
Debug.Log($"Length = {array2[0].Length}");
Debug.Log($"Length = {array2[1].Length}");

実行結果

Length = 2
Length = 3
Length = 4

多次元配列の場合

多次元配列の場合はGetLengthを使って調べられます。

int[,] array3 = new int[,]{
  { 1, 2, 3 },
  { 4, 5, 6 }
};

Debug.Log($"Length = {array3.GetLength(0)}");
Debug.Log($"Length = {array3.GetLength(1)}");

実行結果

Length = 2
Length = 3

sedの基本的な使い方

sedはstream editorの略で入力テキストをフィルタリング・テキスト変換するツールです。いろいろ複雑なこともできますが、ここではsedを使った簡単な文字列置換を紹介してみようと思います。

基本的な使い方

基本的な使い方は次のような感じです。

$ echo "input" | sed "s/pattern/replacement/"

"input"で入力した文字列のうちpatternに該当する部分がreplacementに置き換えられて表示されます。

テキストファイルの文字列を置換したい場合は次のような感じで使います。

$ sed "s/pattern/replacement/" input.txt

※結果を保存したい場合は> output.txtでリダイレクトしてください。

簡単な置換のサンプル

簡単な置換の例として、一番先頭にある小文字のtを大文字のTに置き換えてみます。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/'
sTream editor for filtering and transforming text

tは複数ありますが、何も指定しない場合は一番最初にマッチした部分のみが置き換えられます。今回の場合はstreamのtが該当します。

すべてのtを大文字に置き換えたい場合は"s/pattern/replacement/g"のようにgを追加してください。

$ echo "stream editor for filtering and transforming text" | sed 's/t/T/g'
sTream ediTor for filTering and Transforming TexT

正規表現を使った置換のサンプル

正規表現の詳細は省略しますがsedでも正規表現を使った置換ができます。

簡単な例として、スペース後のワードを-で分割して表示してみたいと思います。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-\2/g"
stream e-ditor f-or f-iltering a-nd t-ransforming t-ext

ポイントとしては\n (nは1から9の数字)を使って()でグループ化したn番目の文字列を参照できるという点です。

ちなみに、マッチした文字列全体を参照したい場合は&が使えます。

$ echo "stream editor for filtering and transforming text" | sed -r "s/ (.)([^ ]*)/ \1-&/g"
stream e- editor f- for f- filtering a- and t- transforming t- text