plant-raspberrypi3のブログ

ラズベリーパイ3とPythonに挑戦して、植物を愛でたり画像を加工したりします。最近はscikit-imageの勉強してます。

PythonのPILモジュールで画像ファイルのコンタクトシート作成 (ただし20枚まで)

撮影した画像のコンタクトシートが作りたくなってPythonで作ってみました。

PILモジュールは、はじめて使いましたが、なかなか使いやすくて良いですね。

 

画像の取り込みと連結の方法は以下のページを参考にさせていただきました。

 

Python 3.5 対応画像処理ライブラリ Pillow (PIL) の使い方 - Librabuch

 

文字列(ファイル名)の画像化は以下のページを参考にさせていただきました。

 

petitviolet.hatenablog.com

 

テスト画像のソースは、皆さんおなじみのいらすとやさんです。

 

www.irasutoya.com

 

以下が作成した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枚分までしか処理できません。今後改良していく予定。

字が小さすぎるので、おいおいフォントをいじれるようになりたいですが

今日のところはとりあえず、これでお茶を濁しました(^ ^;)

 

できた画像がこれです。一応、それっぽくできたかな?

 

f:id:plant-raspberrypi3:20171005135420p:plain

 

追記(2017/10/19):

今回のプログラムを引用した記事がありますので、もしよかったら見ていってください。

 

 

plant-raspberrypi3.hatenablog.com