at_yasu's blog

ロード的なことを

画像を9分割

画像を9分割にしてそれぞれファイルにするという処理が必要になったので、30分プログラミング。

PILとDirectory Listing of /filesにあるjpegsrc.7v ってのが必要です。これのインストールにハマった。。。

後、PILのcropメソッドが、(x,y,width,height)ではなく、(left-x,upper-y,right-x,lower-y1)となってて、right-xが取り出す画像の右辺にあたる場所のピクセルポイントなのに、元画像の右辺からのピクセル数と勘違いしたぐらいで。。。





画像分割はこんな感じに。

 +-----+-----+-----+
 |     |     |     |
 |  1  |  2  |  3  |
 |     |     |     |
 +-----+-----+-----+
 |     |     |     |
 |  4  |  5  |  6  |
 |     |     |     |
 +-----+-----+-----+
 |     |     |     |
 |  7  |  8  |  9  |
 |     |     |     |
 +-----+-----+-----+

処理結果としてはこんな感じ。

元画像



Python のソースコード

#!/usr/bin/python                                                                                                       
# -*- encoding:utf-8 -*-                                                                                                

from PIL import Image
import os
import sys

def nineSplit(im):
    width, height = im.size
    w1, h1 = 0,0
    buff = []

    print "w(%f), h(%f)" % (width, height)
    for h1 in [0.0, (height*(1/3.0)), (height*(2/3.0))]:
        for w1 in [0.0, (width*(1/3.0)), (width*(2/3.0))]:
            w2,h2 = (w1 + (width*(1/3.0))), (h1 + (height*(1/3.0)))
            print "crop (%f, %f, %f, %f)" % (w1, h1, w2, h2)
            c = im.crop((int(w1), int(h1), int(w2), int(h2)))
            buff.append(c)
    return buff


if __name__ == '__main__':
    im = Image.open(sys.argv[1])
    num = 1
    for ig in nineSplit(im):
        ig.save("%d.jpg"%num, "JPEG")
        num += 1