プログラムでおかえしできるかな

定年を過ぎて何かの役に立てないかなと始めた元SEのブログです

画像(写真)を4分割レイアウトにコラージュ【Python】

このエントリーをはてなブックマークに追加

4枚の画像(写真)を上下左右に並べて1枚にするコラージュ画像を作るアプリを作成しました。
作り方と使い方を紹介します。


目次

◆アプリのサンプル画像と機能・特長

▽アプリの画面(Tkinter で作成)

▽生成画像(画面と同じ画像が作成されます)

【機能・特長】

  • 画面上でコラージュ画像の出来上がりを確認できます
  • 生成画像の幅を指定できます
  • 境界線の幅を指定できます
  • 境界線の色を指定できます
    • 色選択ダイアログで色を指定できます
    • 色選択コンボボックスで色名で色を選択できます
  • 一つ目のコラージュ画像のあるフォルダに collageyymmddhhmm.jpg 画像が作成されます

【考え方】

アプリの GUI は次の記事のアプリと全く同じです。
 📖 コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗
 ※GUI に関する内容はこちらの記事を参照してください。

コラージュ画像を作成する部分を GIMP から Python の pillow パッケージを使用するように変更しました。
この後、変更した部分について説明します。

▶アプリの取得方法はこちらをクリックすると記事内でジャンプします。

◆4つの画像をコラージュする処理

pillow ライブラリを使って4つの画像を格子状にコラージュします。
境界線(外枠も含む)を付加できるようにします。

◇処理内容

pillow でコラージュ画像を作成する手順は次の通りです。

  1. 生成画像を生成:new()
    • 境界線の色で塗りつぶした画像を作成します
    • 幅は指定された幅
    • 高さは縮小後のコラージュ画像の高さと境界線の幅を加えたもの
  2. コラージュ画像の処理(4つ)
    • コラージュ画像の読み込み:open()
    • 縮小:thumbnail()
      ((生成画像の幅 - (境界線の幅 * 3)) / 2) の幅に縮小
    • 貼り付け:paste()
      貼り付け位置を上下左右に振り分けます
  3. 保存: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
  • 引数
    • mode:モード。カラーはRGB、透明を扱うならRGBA、モノクロはLなど
      選択肢:1, L, P, RGB, RGBA, CMYK, YCbCr, LAB, HSV, I, F
    • size:幅、高さのタプル
    • color:画像の色。デフォルトは黒。16進値、RBGタプルなどで指定。RGBの場合色名を使えます。

◆ソースの取得

全体のソースはこちらから取得できます。

◇依存関係

◆アプリケーションについて

アプリの取得方法と使い方を説明します。

◇取得と保存

exe ファイルを含んだ zip ファイルを下記からダウンロードして取得します。
ダウンロードした zip ファイルを解凍すると次のフォルダができます。(他にもreadmeなどが入っています)
フォルダの中に exe ファイルが解凍されます。
任意のフォルダにフォルダごと保存してください。

◇使い方

▶使い方の説明は、こちらの記事に掲載しています。
 📖 ◇使い方 - コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗

collage_by_GIMP.exe は collage_by_pillow.exe に読み替えてください。
生成画像は、一つ目のコラージュ画像のあるフォルダにファイル名 collageyymmddhhmm.jpg で作成されます。

◇制限事項

◇動作環境

◇更新情報

  • 2023-10-06 1.1.0:初期リリース

◆さいごに

コラージュを GIMP を使わず、Python だけで作りました。
GUIGIMP を使ったアプリの時に作ったものをそのまま使いました。
pillow での画像の加工はすんなりできました。
GIMP を使うより動作も早いし、そもそも GIMP がいらないので、アプリとしてはこちらの方が使い易いです。

世間には多機能のコラージュアプリがたくさんあります。
競うつもりはないので、機能を限定してブログに使い易いようにもう少し機能を拡張しようかなと思います。
今回は横向きの4つの画像を格子状に並べるだけですが、
縦向きの画像を扱えるようにしたり、
フレームを選べるようにできたり、
のんびり考えてみます。

😢 😢 😢

アプリのリリースは一つの exe ファイルで配布したかったのですが、それだと私が使っているアバストというウィルスチェックソフトにウィルス判定されてしまい、配布を断念しました。
一つの exe ではなくフォルダを含めて exe を作成するとウィルス判定されないのでそれを配布しています。
Pyinstaller のブートローダを再構築すると回避できるようなので、いずれ試してみようと思います。


あわせて読みたい 📖 画像(写真)を4分割レイアウトにコラージュ【GIMP】 🔗
📖 コラージュ処理をPython-FuスクリプトでPythonのGUIを付けて【GIMP、Python】 🔗

◇ご注意

本記事は次のバージョンの下で動作した内容を基に記述しています。

◇免責事項

ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。

◆参考

投稿: