スタンプからアニメーションスタンプを作りたくないですか?
LINEスタンプ制作において、一番の手間は「サイズ調整」と「余白設定」ではないでしょうか。

元画像(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全工程が完了しました!")
使い方のポイント
使い方は非常にシンプルです。
- Pythonファイルと同じ場所に「output」という名前のフォルダを作成します。
- その中に元画像(370x320 px)を全て入れます。
- スクリプトを実行すると、各サイズに最適化されたフォルダが自動生成されます。
特に「中心カット版」は、キャラのサイズ感を維持したい時に重宝します。逆に、全体をしっかり収めたい場合は「縮小版」を選択するなど、用途に合わせて使い分けてみてください。
この自動化で、クリエイティブな作業に集中する時間を増やしましょう!