pythonのPILを使って3枚の画像を横に並べる
PILを今まで使ったことがなく、備忘録のために記録していきます。 あくまでも自分の備忘録です。 コピペの部分が多くまだ使いかたが良くわからないので、間違いなどあれば教えていただけると嬉しいです。
PILはOpenCVのように複雑な処理(この辺りはよくわからないです)はできないらしいですが、今回のように画像をくっつける、トリミングする、回転するなどはできるようです。
ちゃんと調べればもっと色ろなことができそうですが、今回は3枚の画像を横に並べて一枚の画像にしようと思います。
画像の読み込み
from PIL import Image import glob import os # 画像を入れるリストを用意 im_list = [] # globを使ってrawから始まるpngファイルをすべて取得する() # sortedのkeyをgetmtimeでソート png_name = sorted(glob.glob('raw*.png'), key=os.path.getmtime) # im_listの中に for file_name in png_name: print(file_name) Image_tmp = Image.open(file_name) im_list.append(Image_tmp)
ディレクトリの中にrawから始まるpngファイルは3つしかない想定で書いています。 もし、rawから始まるpngファイルがない場合は何も取得できません。
画像のリサイズして保存
# リサイズした画像を入れるリスト resize_im_list =[] for file_name, resize_num in zip(png_name, range(3)): resize_im = im_list[resize_num].resize((256, 256)) file_name_resize = file_name.replace('raw', '') resize_im.save(f'resize{file_name_resize}') resize_im_list.append(resize_im)
画像の大きさをそろえないと見栄えが悪くなりますので、それぞれリサイズして大きさをそろえます。 ただし、画像が小さいものを大きくすると粗い画像になります。
連結する関数
def get_concat_h(im1, im2, im3): # dstは新しいImageオブジェクトを生成しています # Image.newの第二引数はサイズなので、横は3つを足したもの、縦はリサイズしているのでどれでも結果はかわらない dst = Image.new('RGB', (im1.width + im2.width + im3.width, im1.height)) # pasteメソッドを使ってim1の画像を張り付けます # 第二引数は張り付ける位置で、タプル(左上のx座標, 左上のy座標)で指定 dst.paste(im1, (0, 0)) # 二枚目なので左上のx座標はim1.widthを指定 dst.paste(im2, (im1.width, 0)) # 三枚目なので左上のx座標im1.width + im2.widthを指定 dst.paste(im3, (im1.width + im2.width, 0)) return dst
連結する関数の実行
get_concat_h(resize_im_list[0], resize_im_list[1], resize_im_list[2]).save('thumbnail_image.png')
以上!