paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonのPillowライブラリで画像の切り貼り 貼り付け編

貼り付け編

画像ファイルの一部を切り取って貼り付けたいという話ですが、前回無事切り取ることができました。
今回は貼り付け編です。

貼り付け用イメージファイルの作成

画像を張り付ける大元のファイルを作ります。
背景色は何でもいいんですが白にしました。
この時点では真っ白な空の画像ファイルです。

>>> newimfile = Image.new('RGBA', (1920, 1080), 'white')
切り取ったファイルを日付順にソート

前回と同じ方法で更新日順にソートします。

resultlist = sorted(glob.glob('result*.png'), key=lambda f: os.stat(f).st_mtime)
ループで全ファイル貼り付け

各画像ファイルの貼り付けですが、1920 * 1080でファイルを作成しているので サイズを超えないようにします。
また、見やすいように左端から右下へとZ型に貼り付けたいと思います。

  • こんな順番で張り付けたい

f:id:paloma69:20200716223007p:plain

水平に張り付行けていって端までいったら次の段に行きます。

HDサイズだとx座標1920までいったらy座標を移動すればいいですね。
1920を越えないようにx座標始点を1520超えたらy軸移動するようにしました。
1720だとなぜかはみ出たので1520で指定しています。

コードの書き方としてはx座標が1520を超えるまではx座標に貼り付け、
超えたらx座標リセット、y座標をプラスして再スタートという形になりました。

本件のループで初めてcontinueを使いました。
continueはこう使うんですねえ。

貼り付けるコード

画像を張り付けるにはpaste関数を使います。
開いた画像をコピーして張りたいファイルと座標を記載します。

流れは前回と同じなので、これを流します。

>>> x2, y2 = 0, 0
>>> for a in resultlist:
...     imfile = Image.open(a)
...     pastefile = imfile.copy()
...     newimfile.paste(pastefile, (x2, y2))
...     if x2 <= 1520:
...         x2 += 200 # x座標が1520を超えるまでは200置きに貼り付け
...         continue
...     x2 = 0  # x座標が1520を超えたらx座標リセット
...     y2 += 120 # x座標が1520を超えたらy座標を追加
...
  • ループ処理が通ったので確認
>>> newimfile.show()

f:id:paloma69:20200716223255p:plain

いいですね。イメージ通りです。

セーブします。

>>> newimfile.save('result_summary.png')

あとはこれを手動でトリミングして余白を削除します。

同じ手順で勝敗の結果もまとめました。

f:id:paloma69:20200716223340p:plain

以上がこの記事で使ったサマリ画像の作成裏話です。

使った関数のメモ

  • 画像のコピー
imfile = Image.open(a)
pastefile = imfile.copy() # 元ファイルに影響無い様にコピーする
  • 貼り付け
newimfile.paste(pastefile, (x2, y2)) #newimfileイメージにpastefileをx2, y2の位置に貼り付け
  • 画像の表示
newimfile.show()

むすび

プログラミングでGUI処理をしようとすると大変ですが、
今回の画像処理も難しいかなと思いきや、前後編合わせて3時間ほどで出来ました。

プログラミング処理の便利なところは微修正がありつつも基本の処理はそのままなので、何回でもやり直せるのがいいですね。

今回のような作業では手動コピペだとサイズを揃えるのも大変だし、
やり直そうとするとはじめから、となってしまうと思います。

その点今回は何度か失敗したものの、サイズを調整するだけでイメージした画像の作成まで行けてしまいました。

画像処理系のタスクはやったこと無いですが、こんなに便利で楽しいライブラリがあるので
今回の経験をどこかに活かしたいものです。