【GIMP】【Python-Fu】画像を賽の目状に分割する

# バージョン
GIMP 2.10.12

# はじめに
ツクールなどの画像素材でよく見られる、スプライトアニメーション素材や表情差分素材を個別に切り分けたいことがまれにあります。
今回はそのような1枚のセット画像を[GIMP](https://www.gimp.org/)で賽の目状に分割するやり方の紹介です。

![goal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/449fede2-3f85-d03a-3626-7cf58c39af77.png)

なお、今回の素材は[ぴぽや倉庫](https://pipoya.net/sozai/)様からお借りしました。

# 本題に入る前に…
素材を使おうとしているツールに応じて、そもそも**画像ファイル自体を分割する必要があるのか**は一度調べておいた方がいいかもしれません。
例えばUnityであれば、元よりそのような素材に対応していて、画像のインポート設定で分割画像として扱うことができます。（[こちらの記事](https://miyagame.net/sprite/)など参考になります。）

# 手順
流れとしては
1. グリッド状のガイドを作成
2. ガイドに沿ってスライス画像を生成
3. 各画像を保存
となります。

## 【参考】ガイドを作成（手作業）
下記を繰り返し、ガイドを追加していくことでグリッド状のガイドにできます。が、手作業で繰り返すのは面倒なので、**後述のようにPython-Fuを使って一気にやってしまいましょう**。（次の項目で説明）

- メニューから「画像」→「ガイド」→「新規ガイド」を選択します。

![guide01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/4cfb1196-9d64-17f4-740c-31b3e041297b.png)

- 方向とガイドの位置を指定して「OK」を押します。

![guide02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/c5379f5f-c0e3-1075-6699-8b6da4f2c03c.png)

- ガイドができます。

![guide03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/ca2423b4-8b64-be12-978b-3dd4b1acd0b8.png)

## グリッド状のガイドを作成（Python-Fu）
GIMPにはPython-Fuという、Pythonスクリプトで操作できる機能があります。（便利！）

- メニューから「フィルター」→「Python-Fu」→「コンソール」を選択します。

![guide04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/076517fc-a78b-f9a2-e45a-b65faac33b56.png)

- Python コンソール画面が開くので続くスクリプトを実行していきます。各行で何をやっているかについては、Python講座を取り扱ったサイトや書籍等と合わせて[ライブラリリファレンスマニュアル](https://developer.gimp.org/api/2.0/libgimp/index.html)を見て頂くのが早いかと思います。

![guide05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/293d549d-7ddb-724a-92fe-67a8f0877d87.png)

```python:実行するスクリプト例
column = 6 # 切り分けたい列数
row = 12 # 切り分けたい行数
image = gimp.image_list()[0]
step = image.width / column
x = step
while x < image.width:
	pdb.gimp_image_add_vguide(image, x)
	x = x + step

step = image.height / row
y = step
while y < image.height:
	pdb.gimp_image_add_hguide(image, y)
	y = y + step

```

- できました。

![guide06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/98a2d990-a498-eb21-5444-13e0315eb419.png)

## ガイドに沿ってスライス画像を生成
- メニューから「画像」→「Slice Using Guides」を実行します。

![slice01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/760234f7-6f49-75de-0f28-60be055af07c.png)

- ガイドに沿って分割されます。各画像がタブとして上に表示されているのが分かると思います。

![slice02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/fa429d73-944a-1060-0717-f8b1cdfadf30.png)

## 各画像を保存
メニューから「ファイル」→「エクスポート」で一つずつ保存できますが、一括保存はないようなので、ここでもPython-Fuが活躍します。

- Python コンソール画面で次のスクリプトを実行していきます。（元の画像は保存する必要はないので最初に閉じておきましょう。）

```python:実行するスクリプト例
import os
path = "F:\\balloon" # 保存先
count = 0
for image in gimp.image_list():
	count += 1
	file = os.path.join(path, str(count).zfill(2) + ".png")
	pdb.gimp_file_save(image, image.active_layer, file, "")

```

- 指定したフォルダにどんどん吐き出されていきます。めでたく分割することができました。

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483690/f6bea872-d692-789b-df58-3696936f68c9.png)

# おわりに
フリーで高機能なことで有名なGIMPですが、人気のPythonでスクリプトを書けるのは非常に嬉しいですね。
もっと使いこなせるようになりたいと思いました。

# 参考
- http://xn--u9j207iixgbigp2p.xn--tckwe/archives/3404