画像ファイルを分割して別々のファイルとして保存する

1つの画像ファイルを読み込んで、15パズル用に4x4の16分割したファイルとして保存したい。PIL(Python Imaging Library)を使えば、この処理も簡単にできてしまうのがPythonの凄いところ。

今回行う処理内容は上の図の通り。1枚の絵を16分割する。
一連の処理を行うコードを見ていく。

import Image

#im = Image.open("test.png")
im = Image.open("test.bmp")
w = im.size[0]
h = im.size[1]
rsize = min(w, h)
box = (0, 0, rsize, rsize)
region= im.crop(box)
...

まずはコードの前半部分。何はなくともPILモジュールをimportする。それから、画像ファイルをopenする。sizeメソッドで、画像サイズ(単位はピクセル)をタプルとして取り出せる。横(w)、縦(h)のサイズを確認してから、小さい方(min(w,h))のサイズに合わせて読み込んだ画像をトリムする(im.crop(box))。
15パズル用の画像は正方形がいいので(そうでもないか?)、ここでは読み込んだ画像のサイズを調整した。

...
subregion = list()
ds = float(rsize)/4.0
for i in xrange(4):
    wmin = int(ds*i)
    wmax = int(ds*(i+1))
    for j in xrange(4):
        k = 4*i + j
        hmin = int(ds*j)
        hmax = int(ds*(j+1))
        box = (wmin, hmin, wmax, hmax)
        subregion.append(region.crop(box))

for num in xrange(16):
    subregion[num].save(str(num)+'.jpg', "JPEG")

そして、コードの後半部分。調整後の画像サイズを4等分して、16分割される画像の左上と右下の座標を指定する(box=のところ)。原点は左上であり、heightは下方向に増加することに注意する。2つのfor文で、16分割(region.crop(box))している。
それら、16枚の絵をファイルに保存しているのが最後の部分。番号をファイル名として、JPEG形式のファイルとしている。