Toma(とま)のゲーム日記

MHNOW、MHWIB、ELDEN RING、WILD HEARTSなどの役立ち情報をアップしていきます。ツイッターでの懸賞応募、自炊、家庭菜園といろいろ始めました。

記事内に商品プロモーションを含む場合があります。

【LINEスタンプ】大量の画像に「Sample」を付けたい!Pythonスクリプトで一括加工&1枚に結合【初心者向け】

AIでLINEスタンプを作っていると、SNSでの宣伝用や進捗報告用に、複数の画像を1枚にまとめたいときがありますよね。また、無断転載防止のために「Sample」のロゴを入れたいという場面も多いはず。

LINEスタンプの画像にSampleロゴが入り、タイル状に結合された完成イメージ

注意:枠なしの画像で実施してください。枠まで画像に追加されます。今回の設位の絵にはわかりやすくするため、枠を追記しています。

 

今回は、Pythonを使って複数の画像に一括でSampleロゴを入れ、さらにそれらをタイル状に1枚の画像へ結合する方法をご紹介します。手作業で1枚ずつ加工する手間を、プログラムでサクッと解決してしまいましょう!

第1章:画像に「Sample」ロゴを一括挿入する

Pythonコードで画像の中央にオレンジ色のSampleロゴが挿入される様子

まずは、指定したフォルダ内の画像すべてに、透かし(ウォーターマーク)として「Sample」の文字を入れるスクリプトです。


# サブフォルダoutput内にある画像ファイルにSampleの文字を追加するコード
from PIL import Image, ImageDraw, ImageFont
import os

# --- 設定エリア ---
INPUT_DIR = "output"
OUTPUT_DIR = "output"
TEXT = "Sample"
# メインの文字色:オレンジ / 透明度 約75%
TEXT_COLOR = (255, 165, 0, 192)
# 縁取りの色
OUTLINE_WHITE = (255, 255, 255, 192) # 外側の白
OUTLINE_BLACK = (0, 0, 0, 192)       # 内側の黒
# ----------------

def add_fancy_sample_watermark():
    if not os.path.exists(INPUT_DIR):
        print(f"フォルダが見つかりません: {INPUT_DIR}")
        return

    files = [f for f in os.listdir(INPUT_DIR) if f.endswith((".png", ".jpg", ".jpeg"))]
    
    for file_name in files:
        file_path = os.path.join(INPUT_DIR, file_name)
        img = Image.open(file_path).convert("RGBA")
        
        # 文字用のレイヤー(透明)
        txt_layer = Image.new("RGBA", img.size, (255, 255, 255, 0))
        draw = ImageDraw.Draw(txt_layer)
        
        try:
            font = ImageFont.truetype("arial.ttf", 80) 
        except:
            font = ImageFont.load_default()

        # 配置計算(中央配置)
        bbox = draw.textbbox((0, 0), TEXT, font=font)
        tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1]
        x, y = (img.width - tw) / 2, (img.height - th) / 2

        # 縁取りを描画して視認性を高める(外側から順に重ねる)
        for dx in range(-2, 3):
            for dy in range(-2, 3):
                draw.text((x + dx, y + dy), TEXT, font=font, fill=OUTLINE_WHITE)

        draw.text((x, y), TEXT, font=font, fill=TEXT_COLOR)

        # 合成して保存
        combined = Image.alpha_composite(img, txt_layer)
        combined.convert("RGB").save(file_path) # 上書き保存
        print(f"加工完了: {file_name}")

if __name__ == "__main__":
    add_fancy_sample_watermark()

このコードのポイントは、文字に白と黒の縁取りを入れることで、どんな背景の画像でも文字が見やすくなる点です。LINEスタンプのように背景色がバラバラな画像には欠かせない工夫ですね。

 

第2章:複数の画像をタイル状に1枚にまとめる

次に、ロゴを入れた画像たちを1枚の大きな画像に結合します。枚数に合わせて、自動的に最適なグリッドサイズ(縦横の並び)を計算するようにしています。

バラバラの画像ファイルが1枚の大きな画像に整列して結合されるプロセス

注意:枠なしの画像で実施してください。枠まで画像に追加されます。今回の設位の絵にはわかりやすくするため、枠を追記しています。

 


# outputフォルダ内にある画像ファイルを1枚に結合するコード
from PIL import Image
import os
import math

def auto_merge_images():
    input_dir = "output"
    save_name = "auto_merged_result.png"
    
    # 1. フォルダ内の画像リストを取得
    files = [f for f in os.listdir(input_dir) if f.endswith((".png", ".jpg", ".jpeg"))]
    file_count = len(files)
    
    if file_count == 0:
        print("エラー: 画像がありません。")
        return

    # 2. 1枚目の画像からサイズを自動取得
    first_tile_path = os.path.join(input_dir, files[0])
    with Image.open(first_tile_path) as first_tile:
        tile_w, tile_h = first_tile.size
    
    # 3. グリッドサイズ(n x n)を計算(ルートの切り上げで正方形に近づける)
    grid_size = math.ceil(math.sqrt(file_count))
    if grid_size < 2:
        grid_size = 2

    # 4. キャンバスの作成
    canvas_w = tile_w * grid_size
    canvas_h = tile_h * grid_size
    new_img = Image.new("RGBA", (canvas_w, canvas_h), (0, 0, 0, 0))

    # 5. 画像を順番に貼り付け
    for index, file_name in enumerate(files):
        r = index // grid_size
        c = index % grid_size
        
        file_path = os.path.join(input_dir, file_name)
        with Image.open(file_path) as tile:
            new_img.paste(tile, (c * tile_w, r * tile_h))
    
    new_img.save(save_name)
    print(f"結合完了: {save_name}")

if __name__ == "__main__":
    auto_merge_images()

このスクリプトを使えば、画像が何枚あっても自動で最適な形に並べてくれるので、SNSに投稿する際の「一覧画像」作成が非常にスムーズになります。

まとめ

手動でやると意外と時間がかかる「ロゴ入れ」と「画像結合」。PythonのPillowライブラリを活用すれば、一瞬で終わらせることができます。クリエイティブな作業時間を確保するためにも、こういった自動化ツールを積極的に活用していきたいですね!

作業の際は、元画像を上書きしてしまわないよう、必ずコピーした画像が入ったフォルダで実行することを推奨します。

 

こちらの記事はNoteの記事を流用しています。