PythonのPILモジュールで画像ファイルのコンタクトシート作成 (ただし20枚まで)
撮影した画像のコンタクトシートが作りたくなってPythonで作ってみました。
PILモジュールは、はじめて使いましたが、なかなか使いやすくて良いですね。
画像の取り込みと連結の方法は以下のページを参考にさせていただきました。
Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方 - Librabuch
文字列(ファイル名)の画像化は以下のページを参考にさせていただきました。
テスト画像のソースは、皆さんおなじみのいらすとやさんです。
以下が作成したPythonのコードです。
早速、Jupyter labを使いました。便利!
コンタクトシートにしたい画像をPIL_testフォルダ内に入れた後、処理を実行。
%matplotlib inline import os from PIL import Image, ImageDraw import numpy as np os.chdir('/usr/local/working/PIL_test') #フォルダ内のpngファイル名をリスト化 all_files = os.listdir('/usr/local/working/PIL_test') png_files = [i for i in all_files if i.endswith(".png")] #pngファイルを読み込む im_series = [Image.open(i) for i in png_files] #各画像のサイズを書き出し for i in range(len(im_series)): print(png_files[i],np.array(im_series[i]).shape) #各画像を小さくリサイズ im_series_resize = [] for i in range(len(im_series)): width = np.array(im_series[i]).shape[0] length = np.array(im_series[i]).shape[1] if width < length: im_series_resize.append(im_series[i].resize((200,int(200*width/length)))) else: im_series_resize.append(im_series[i].resize((int(200*length/width),200))) #ファイル名のテキスト画像の準備 text_fig_list = [] for i in png_files: img_text = Image.new('RGB', (240, 20), (255,255,255)) draw = ImageDraw.Draw(img_text) draw.text((0, 0), i, (0, 0, 0)) text_fig_list.append(img_text) #4列6行のコンタクトシート(1000x1325)を作成 fig_width = 240 fig_length = 265 if len(im_series) < 20: canvas = Image.new('RGB', (1000, 1350), (255, 255, 255)) for i in range(len(im_series_resize)): temp_canvas = Image.new("RGB",(fig_width,fig_length),(255,255,255)) temp_canvas.paste(text_fig_list[i],(0,0)) try: temp_canvas.paste(im_series_resize[i],(0,20), im_series_resize[i].split()[3]) except IndexError: temp_canvas.paste(im_series_resize[i],(0,20)) canvas.paste(temp_canvas, (10+int(i%4)*fig_width,10+int(i/4)*fig_length))
まだ、画像20枚分までしか処理できません。今後改良していく予定。
字が小さすぎるので、おいおいフォントをいじれるようになりたいですが
今日のところはとりあえず、これでお茶を濁しました(^ ^;)
できた画像がこれです。一応、それっぽくできたかな?
追記(2017/10/19):
今回のプログラムを引用した記事がありますので、もしよかったら見ていってください。
plant-raspberrypi3.hatenablog.com