4枚の画像(写真)を上下左右に並べて1枚にするコラージュ画像を作るアプリを作成しました。
作り方と使い方を紹介します。
目次
◆アプリのサンプル画像と機能・特長
▽アプリの画面(Tkinter で作成)
▽生成画像(画面と同じ画像が作成されます)
【機能・特長】
- 画面上でコラージュ画像の出来上がりを確認できます
- 生成画像の幅を指定できます
- 境界線の幅を指定できます
- 境界線の色を指定できます
- 色選択ダイアログで色を指定できます
- 色選択コンボボックスで色名で色を選択できます
- 一つ目のコラージュ画像のあるフォルダに
collageyymmddhhmm.jpg
画像が作成されます
【考え方】
アプリの GUI は次の記事のアプリと全く同じです。
📖 コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗
※GUI に関する内容はこちらの記事を参照してください。
コラージュ画像を作成する部分を GIMP から Python の pillow パッケージを使用するように変更しました。
この後、変更した部分について説明します。
▶アプリの取得方法はこちらをクリックすると記事内でジャンプします。
◆4つの画像をコラージュする処理
pillow ライブラリを使って4つの画像を格子状にコラージュします。
境界線(外枠も含む)を付加できるようにします。
◇処理内容
pillow でコラージュ画像を作成する手順は次の通りです。
- 生成画像を生成:
new()
- 境界線の色で塗りつぶした画像を作成します
- 幅は指定された幅
- 高さは縮小後のコラージュ画像の高さと境界線の幅を加えたもの
- コラージュ画像の処理(4つ)
- コラージュ画像の読み込み:
open()
- 縮小:
thumbnail()
((生成画像の幅 - (境界線の幅 * 3)) / 2)
の幅に縮小 - 貼り付け:
paste()
貼り付け位置を上下左右に振り分けます
- コラージュ画像の読み込み:
- 保存:
save()
▽◇コード:コラージュ処理
def collage_images(self, img_paths:list, border_rgb:tuple, img_width:int, border_width:int, event=None) -> int: """ 画像のコラージュ Args: list: 画像ファイルパス(4つ) tuple: 境界線の色(RGB) int: 再生画像の幅 Returns: int: 結果(0:OK、-1:書き込みエラー) """ # 保存パス out_f_dir = os.path.dirname(img_paths[0]) # 一つ目の画像のフォルダを出力フォルダにする out_f_name = "collage" + datetime.now().strftime('%y%m%d%H%M') + ".jpg" new_path = os.path.join(out_f_dir, out_f_name) _width = img_width # 生成画像の幅 _swidth = (_width - border_width * 3) // 2 # 横に2分割した時のコラージュ画像の幅 _sheight = _swidth * 3 // 4 # コラージュ画像の高さ アスペクト比4:3で計算 _height = (_sheight * 2) + (border_width * 3) # 生成画像の高さ print(f"生成画像 {_width}, {_height} 画像 {_swidth}, {_sheight}") base_im = Image.new('RGB', (_width, _height), border_rgb) x = y = border_width for path in img_paths: im = Image.open(path) # 縮小(計算した高さを使うと小さくなるので使わない) im.thumbnail((_swidth, _swidth), Image.BICUBIC) print(f"Thumbnail to {_swidth}, {_sheight} result {im.width}, {im.height}") base_im.paste(im, (x, y)) # 貼り付けてマージ # 次の貼り付け位置(幅に収まらなくなったら高さを変える) if x + im.width + border_width < _width: x += im.width + border_width else: x = border_width y += im.height + border_width # 保存jpeg try: base_im.save(new_path, quality=100, subsampling=0) except OSError: return -1 return 0
◇pillowパッケージImageクラスのメソッド
画像の加工に使用する pillow パッケージの Image クラスの主なメソッドを説明します。
▽thumbnail() 縮小
画像を縮小します。
指定した大きさに収まるよう縮小(アスペクト比固定)します。
※この関数は元の画像を直接リサイズします。
※拡大はできません。
- 【構文】
Image.thumbnail(size, resample=Resampling.BICUBIC, reducing_gap=2.0)
- 引数
size
:縮小後の幅, 高さ。resample
:補完方法(サイズ変換のフィルターと同様)NEAREST
:最近傍補間BOX
:BILINEAR
:線形補間HAMMING
:BICUBIC
:三次補間(デフォルト)LANCZOS
:Lanczos 補間
▽paste() 貼り付け
画像オブジェクトに im 画像を貼り付けます。
画像は拡大縮小しません。
- 【構文】
Image.paste(im, box=None, mask=None)
- 引数
im
:ソース画像またはピクセル値 (整数またはタプル)box
:ペースト先の領域を指定- 2タプル:左上隅の座標(x, y)
- 4タプル:(左上のx, 左上のy, 右下のx, 右下のy)
貼り付ける画像のサイズと一致する必要があります - 省略またはなし:貼り付けられる画像の左上隅
mask
:マスク画像。指定された場合マスクで示された領域のみを更新。
▽new() 新規画像作成
画像を作成します。
- 【構文】
PIL.Image.new(mode, size, color=0) -> Image
- 引数
◆ソースの取得
全体のソースはこちらから取得できます。
- ソース:
collage_by_pillow.py
- 取得先:GitHub juu7g/Python-collage
◇依存関係
- Python 3.8.5
- Pillow 10.0.0
◆アプリケーションについて
アプリの取得方法と使い方を説明します。
◇取得と保存
exe ファイルを含んだ zip ファイルを下記からダウンロードして取得します。
ダウンロードした zip ファイルを解凍すると次のフォルダができます。(他にもreadmeなどが入っています)
フォルダの中に exe ファイルが解凍されます。
任意のフォルダにフォルダごと保存してください。
- フォルダ:
collage_by_pillow
- アプリ:
collage_by_pillow.exe
- アプリ:
- 取得先:Github からダウンロード(zipファイル)
◇使い方
▶使い方の説明は、こちらの記事に掲載しています。
📖 ◇使い方 - コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗
collage_by_GIMP.exe は collage_by_pillow.exe に読み替えてください。
生成画像は、一つ目のコラージュ画像のあるフォルダにファイル名 collageyymmddhhmm.jpg
で作成されます。
◇制限事項
- 横向きでアスペクト比が 4:3 の画像が対象です
◇動作環境
- Windows 64ビット OS
◇更新情報
- 2023-10-06 1.1.0:初期リリース
◆さいごに
コラージュを GIMP を使わず、Python だけで作りました。
GUI は GIMP を使ったアプリの時に作ったものをそのまま使いました。
pillow での画像の加工はすんなりできました。
GIMP を使うより動作も早いし、そもそも GIMP がいらないので、アプリとしてはこちらの方が使い易いです。
世間には多機能のコラージュアプリがたくさんあります。
競うつもりはないので、機能を限定してブログに使い易いようにもう少し機能を拡張しようかなと思います。
今回は横向きの4つの画像を格子状に並べるだけですが、
縦向きの画像を扱えるようにしたり、
フレームを選べるようにできたり、
のんびり考えてみます。
😢 😢 😢
アプリのリリースは一つの exe ファイルで配布したかったのですが、それだと私が使っているアバストというウィルスチェックソフトにウィルス判定されてしまい、配布を断念しました。
一つの exe ではなくフォルダを含めて exe を作成するとウィルス判定されないのでそれを配布しています。
Pyinstaller のブートローダを再構築すると回避できるようなので、いずれ試してみようと思います。
📖 コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗
◇ご注意
本記事は次のバージョンの下で動作した内容を基に記述しています。
- Python 3.8.5
- Pillow 10.0.0
◇免責事項
ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。