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')

以上!

参考

note.nkmk.me