Toma(とま)のゲーム日記

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

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

【コピーボタン付】LINEアニメスタンプ用サイズ変換を一括自動化するPython術【初心者向け】

スタンプからアニメーションスタンプを作りたくないですか?

LINEスタンプ制作において、一番の手間は「サイズ調整」と「余白設定」ではないでしょうか。

LINEアニメーションスタンプ制作のサイズ規定(320x270, 240x240, 96x74)を説明するアイキャッチ画像

元画像(370x320 px)から、スタンプ本体(320x270 px)、メイン画像(240x240 px)、タブ画像(96x74 px)と、規定に合わせて複数のサイズを用意する必要があります。

今回は、Pythonを使ってこれらを一括で自動生成する便利なスクリプトをご紹介します。

スクリプトの概要

このスクリプトを実行すると、指定したフォルダ内の全てのPNG画像に対して以下の4パターンを同時に書き出します。

  • ① アニメスタンプ用(縮小版) 0.86倍に縮小し、320x270 pxに変換
  • ② アニメスタンプ用(カット版) 表示倍率はそのまま、中心を320x270 pxで切り抜き
  • ③ メイン画像用(APNG用素材) 0.64倍に縮小し、240x240 pxに変換
  • ④ タブ画像用 規定の96x74 pxにリサイズ

全ての画像において、LINE審査で重要な「上下左右の透過余白(5px〜)」を自動で確保するよう設計しています。

import os
from PIL import Image

# フォルダ設定
input_folder = "output" # 元画像が入っているフォルダ
output_folder_1 = "out_style_1_resize_320" # ① アニメ用縮小(320x270)
output_folder_2 = "out_style_2_crop_320"   # ② アニメ用カット(320x270)
output_folder_3 = "out_style_3_main_240"   # ③ main.png用(240x240)
output_folder_4 = "out_style_4_tab_96"     # ④ tab.png用(96x74)

# 全フォルダ作成
for folder in [output_folder_1, output_folder_2, output_folder_3, output_folder_4]:
    os.makedirs(folder, exist_ok=True)

def process_stamps():
    # 各ターゲットサイズ
    size_320 = (320, 270)
    size_240 = (240, 240)
    size_tab = (96, 74)
    
    # 透過余白(マージン)設定
    margin_5 = 5   # 320px, 240px用
    
    # 描画可能エリア(マージンを引いたサイズ)
    draw_320_w, draw_320_h = 310, 260
    draw_240_w, draw_240_h = 230, 230
    draw_tab_w, draw_tab_h = 90, 68

    # input_folder内のPNGファイルを取得
    files = [f for f in os.listdir(input_folder) if f.lower().endswith(".png")]
    
    if not files:
        print(f"エラー: '{input_folder}' フォルダに画像が見つかりません。")
        return

    for filename in files:
        img_path = os.path.join(input_folder, filename)
        
        with Image.open(img_path).convert("RGBA") as img:
            
            # --- ① 320x270 縮小版 ---
            canvas1 = Image.new("RGBA", size_320, (255, 255, 255, 0))
            resized_320 = img.resize((draw_320_w, draw_320_h), Image.LANCZOS)
            canvas1.paste(resized_320, (margin_5, margin_5))
            canvas1.save(os.path.join(output_folder_1, filename))

            # --- ② 320x270 中心カット版 ---
            canvas2 = Image.new("RGBA", size_320, (255, 255, 255, 0))
            left = (img.width - draw_320_w) / 2
            top = (img.height - draw_320_h) / 2
            cropped = img.crop((left, top, left + draw_320_w, top + draw_320_h))
            canvas2.paste(cropped, (margin_5, margin_5))
            canvas2.save(os.path.join(output_folder_2, filename))

            # --- ③ 240x240 縮小版 (main用) ---
            canvas3 = Image.new("RGBA", size_240, (255, 255, 255, 0))
            resized_240 = img.resize((draw_240_w, draw_240_h), Image.LANCZOS)
            canvas3.paste(resized_240, (margin_5, margin_5))
            canvas3.save(os.path.join(output_folder_3, filename))

            # --- ④ 96x74 縮小版 (tab用) ---
            canvas4 = Image.new("RGBA", size_tab, (255, 255, 255, 0))
            img_ratio = img.width / img.height
            tab_ratio = draw_tab_w / draw_tab_h
            
            if img_ratio > tab_ratio:
                tw, th = draw_tab_w, int(draw_tab_w / img_ratio)
            else:
                th, tw = draw_tab_h, int(draw_tab_h * img_ratio)
                
            resized_tab = img.resize((tw, th), Image.LANCZOS)
            px, py = (size_tab[0] - tw) // 2, (size_tab[1] - th) // 2
            canvas4.paste(resized_tab, (px, py))
            canvas4.save(os.path.join(output_folder_4, filename))

        print(f"処理完了: {filename}")

if __name__ == "__main__":
    if not os.path.exists(input_folder):
        print(f"エラー: '{input_folder}' フォルダを作成し、画像を配置してください。")
    else:
        process_stamps()
        print("\n全工程が完了しました!")

使い方のポイント

使い方は非常にシンプルです。

  1. Pythonファイルと同じ場所に「output」という名前のフォルダを作成します。
  2. その中に元画像(370x320 px)を全て入れます。
  3. スクリプトを実行すると、各サイズに最適化されたフォルダが自動生成されます。

特に「中心カット版」は、キャラのサイズ感を維持したい時に重宝します。逆に、全体をしっかり収めたい場合は「縮小版」を選択するなど、用途に合わせて使い分けてみてください。

この自動化で、クリエイティブな作業に集中する時間を増やしましょう!