Toma(とま)のゲーム日記

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

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

めんどくさい画像分割をPythonで解決!3×3のアイコン画像をコード実行で透過&スタンプ素材にする

LINEスタンプを自作していると、避けて通れないのが「画像の切り出し」と「背景の透過処理」という地味に重たい作業です。

明るいデジタルイラストのサムネイル。青い鳥のキャラクターがデスクで作業しており、パソコンのモニターからはPythonロゴと、9枚並んだ透過済みアイコンスタンプが飛び出している。上部には『Pythonで画像処理を自動化! 透過・分割を一気に終わらせる』、下部には『LINEスタンプ制作の作業時間を99%カット』とテキストが書かれている。左下には関連記事のアイコン群(1.準備から4.自動化)、右側には『次回予告 ZIP化』のZipアイコンがある。

これまでは1枚ずつ丁寧に加工していましたが、3×3のグリッドに並んだ画像を、1枚ずつ範囲指定して切り出して、さらに背景を抜いて……という工程を繰り返すのは、正直言ってかなり「めんどくさい」作業でした。

「もっと楽に、一瞬で終わらせる方法はないか?」

そう考えて作成したのが、Pythonを使った自動化ツールです。このツールを使えば、1枚の画像から「透過」と「分割」をコード実行だけで同時に終わらせることができます。

今回は、エンジニアらしく「面倒なことはコードに任せる」スタイルで、スタンプ制作を劇的に効率化する方法をご紹介します。

以前の記事で紹介したスタンプ制作の軌跡(全4回)とあわせて、ぜひ参考にしてみてください。

 

 

LINEスタンプ制作において、最も時間を取られるのが「画像素材の準備」です。特に、1枚の大きな画像に複数のイラストを描き込んだ場合、それらを1枚ずつのスタンプ用データに切り出す作業が発生します。

LINEスタンプ作りで一番大変な「切り出し」と「透過」

通常、スタンプ制作には以下の工程が必要になります。

  • 各イラストの境界を目安に正確にトリミングする
  • 背景を1枚ずつ透明にする(透過処理)
  • 規定のサイズ(370×320px以内)にリサイズして保存する

これをスタンプの最小単位である8個、あるいは最大の40個分繰り返すのは、非常に集中力を消耗する「作業」です。手作業では、数ピクセルのズレや透過漏れといったミスも起こりやすくなります。

3×3の画像を1枚ずつ加工するのはもう古い?

最近のイラストアプリは多機能ですが、それでも「9枚並んだ画像を等間隔で切り抜いて、個別に透過保存する」といった定型処理を自動化するのは、標準機能だけでは限界があります。

特に、私のように「3×3のグリッド(計9枚)で下書きから清書までまとめて描く」スタイルをとっている場合、この分割作業がボトルネックになっていました。

Pythonを使って「全自動」で終わらせるメリット

そこで活用したいのがPythonです。プログラムを書くことで、これまで数十分かかっていた作業をわずか数秒の「実行」だけで完結させることが可能になります。

自作ツールによる自動化のメリットは以下の通りです。

  1. 作業時間の圧倒的な短縮:1枚ずつ範囲指定する手間がゼロになります。
  2. 精度の均一化:プログラムが計算して分割するため、切り出し位置が1ピクセルも狂いません。
  3. 精神的な余裕:単純作業から解放され、よりクリエイティブな「絵を描くこと」に専念できます。

まさに、エンジニアが日常の業務で行っている「定型業務の自動化」を趣味のクリエイティブに応用した形です。次章では、実際にどのようなコードでこの魔法を実現したのか、詳しく解説していきます。

 

今回作成したツールは、3×3の形式で並んだ1枚の画像(下書きや清書データ)を入力すると、スタンプとしてそのまま使える状態まで一気に加工するものです。内部的には以下の3つのステップを自動で実行しています。

① 背景の一括透過処理

スタンプ制作において、背景が白のままだと「シール」として機能しません。このツールでは、指定した色(主に白や背景色)を判別し、画像全体から背景を自動で透過(透明化)します。

手作業で「消しゴムツール」や「自動選択ツール」を使う必要がなく、複雑な輪郭のイラストでもアルファチャンネルを保持したまま正確に処理できるのが強みです。

② 指定した行・列でのグリッド分割

次に、1枚の大きな画像を正確に分割します。今回は「3×3」の指定を行っていますが、コードの引数を変えるだけで「2×4」など柔軟に変更可能です。

手動で切り出す際に起こりがちな「位置の微妙なズレ」や「余白のバラつき」といったミスは、プログラムによる座標計算によって完全に排除されています。
※分割範囲:10–20px程度の余白を持たせた計算も、コード上で一括制御しています。

③ 透過から分割までをワンストップで実行

最大の特徴は、これら個別の機能を順番に呼び出す「メイン実行コード」を組んだ点にあります。

  1. フォルダ内の画像を読み込む
  2. 透過処理をかける
  3. 9枚の画像に分割して保存する

この一連の流れを「1回の実行(Run)」だけで完結させました。まさに、手作業で1枚ずつ保存ボタンを押していた時間が、コーヒーを一口飲む間の待ち時間へと変わる瞬間です。

補足:エンジニア視点のこだわり

今回のコードでは、単に分割するだけでなく、出力されるファイル名に「row1_col1.png」のように行列番号を自動で付与するようにしました。これにより、どのイラストがどの位置にあったものか、後からの整理も非常に楽になっています。

 

それでは、実際に作成したPythonコードのポイントを解説します。今回は画像処理の定番ライブラリである「Pillow (PIL)」を使用しました。

使用するライブラリと準備

まずは必要なライブラリをインストールしておきます。標準的な環境であれば、以下のコマンドですぐに準備が整います。

pip install Pillow

コードの核心:透過と分割のロジック

プログラムの主な処理は、大きく分けて「透過」と「分割」の2段階です。特にこだわったのは、「透過処理をした後に分割する」という順番です。これにより、切り出された後の各画像はすべて背景が透明な状態で保存されます。

1. 背景の透過(Transparent PNG)

画像の特定の色(今回は白)を透明に変換します。convert("RGBA")を使用し、ピクセルごとに透明度を操作することで、スタンプとして自然な仕上がりを実現しています。背景色に合わせて target_color を調整してください。

from PIL import Image
import os

# --- 設定 ---
INPUT_FILE = "input_image.png" 
OUTPUT_FILE = "tr_input_image.png"
# ------------

def fix_transparency_final():
    if not os.path.exists(INPUT_FILE):
        print(f"エラー: {INPUT_FILE} が見つかりません。")
        return

    img = Image.open(INPUT_FILE).convert("RGBA")
    datas = img.getdata()
    new_data = []
    count = 0

    print("背景の緑をスキャンして削除しています...")

    for item in datas:
        r, g, b, a = item
        
        # 【新ロジック】
        # 「緑(G)が、赤(R)と青(B)の両方よりも明らかに大きい」場合を背景とみなす
        # 差が 30 以上あれば、ほぼ間違いなくあの黄緑色です
        if g > r + 30 and g > b + 30:
            # 透明にする
            new_data.append((255, 255, 255, 0))
            count += 1
        else:
            # それ以外(キャラの服、白フチ、文字)はそのまま
            new_data.append(item)

    img.putdata(new_data)
    img.save(OUTPUT_FILE, "PNG")
    
    print("-" * 20)
    print(f"完了! 透明にしたピクセル数: {count}")
    print(f"保存先: {OUTPUT_FILE}")

if __name__ == "__main__":
    fix_transparency_final()
    

2. グリッド分割(Grid Split)

3×3の分割は、画像の幅と高さを3等分してループ処理で切り出します。ここで注意が必要なのは、「割り切れないピクセル」の扱いです。単純に切り捨てると画像端が切れてしまうため、座標計算を正確に行う必要があります。

from PIL import Image
import os

def split_image_with_limit():
    input_file = "tr_input_image.png"
    output_dir = "output"
    
    if not os.path.exists(input_file):
        print(f"エラー: '{input_file}' が見つかりません。")
        return

    print("--- 画像分割の設定 (最大5まで) ---")
    try:
        rows = int(input("縦に何分割しますか? (1〜5): "))
        cols = int(input("横に何分割しますか? (1〜5): "))
        
        # 【追加】入力値のチェック
        if not (1 <= rows <= 5) or not (1 <= cols <= 5):
            print("エラー: 1から5の範囲の数字を入力してください。処理を中断します。")
            return
            
    except ValueError:
        print("エラー: 半角数字で入力してください。")
        return

    # 画像の読み込み
    img = Image.open(input_file)
    width, height = img.size
    tile_w = width // cols
    tile_h = height // rows

    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 分割処理
    for r in range(rows):
        for c in range(cols):
            left = c * tile_w
            upper = r * tile_h
            right = left + tile_w if (c < cols - 1) else width
            bottom = upper + tile_h if (r < rows - 1) else height
            
            tile = img.crop((left, upper, right, bottom))
            tile.save(os.path.join(output_dir, f"tile_{r}_{c}.png"))
            
    print("-" * 20)
    print(f"完了! {rows}x{cols} 枚に分割して '{output_dir}/' に保存しました。")

if __name__ == "__main__":
    split_image_with_limit()

一括実行用メインコード

上記2つの関数を組み合わせて、1枚の画像から9枚のスタンプ素材を一気に生成するコードです。「手作業なら5分、コードなら0.1秒」という圧倒的な速度差を体感できます。

import subprocess
import sys
import os

def run_task(script_name):
    """別のPythonファイルを実行する共通関数"""
    if not os.path.exists(script_name):
        print(f"【エラー】 {script_name} が見つかりません。")
        return False
    
    print(f"\n>>> {script_name} を実行しています...")
    try:
        # 外部スクリプトを実行。正常終了(0)以外ならエラーを出す
        subprocess.run([sys.executable, script_name], check=True)
        return True
    except subprocess.CalledProcessError:
        print(f"【中断】 {script_name} の実行中にエラーが発生しました。")
        return False

def main():
    print("====================================")
    print("   スタンプ制作一括処理メニュー")
    print("====================================")

    # 1. まずは透過処理(③)を無条件で実行
    print("\n--- STEP 1: 透過処理 (③process_final.py) ---")
    if not run_task("process_final.py"):
        print("透過処理に失敗したため、終了します。")
        return

    # 2. 分断作業(①)を実施するか問い合わせ
    print("\n" + "-"*40)
    ans = input("透過処理が完了しました。続けて【画像の分断】を実施しますか? (Y/N): ")
    
    if ans.lower() in ["y", "yes"]:
        print("\n--- STEP 2: 画像分断 (①split.py) ---")
        if run_task("split.py"):
            print("\nすべての工程が正常に完了しました!")
    else:
        print("\n分断作業はスキップされました。")
        print("透過済み画像(tr_input_image.png)を確認してください。")

if __name__ == "__main__":
    main()

エンジニアの知恵袋:再利用性の確保

今回のコードでは rowscols を変数にしているため、将来的に「2×4」や「5×5」といった別のフォーマットで画像を作った際も、数値を書き換えるだけで対応可能です。こうした汎用性を持たせておくのが、長く使えるツール作りのコツです。

 

今回作成したPythonツールを実際にスタンプ制作のワークフローに組み込んでみたところ、想像以上の「威力」を実感することになりました。

作業時間が45分から数秒に短縮!

これまでは、グラフィックソフトを開いて「範囲選択」→「コピー」→「新規作成」→「背景透過保存」という工程を、画像9枚分繰り返していました。実は背景透過保存を無料ツールでやっていたため手作業で消し込む必要があり1枚のシートを処理するのに5分程度はかかっていた計算です。

それがこのツールを使えば、コードを実行した瞬間にフォルダへ9枚の透過済み画像が並びます。実質的な処理時間は1秒にも満たない「爆速」の世界です。単純計算で作業効率は数百倍になったと言っても過言ではありません。

ミスが減り、クリエイティブな作業に集中できる環境作り

自動化の真の価値は、単なる時短だけではありません。手作業で起こりがちな「保存し忘れ」や「透過し損ねた数ピクセルのゴミ」といった人的ミスが、ロジックによる処理でゼロになります。

「失敗するかもしれない」という不安を抱えながら単純作業を繰り返すのは、意外と精神的なエネルギーを消耗するものです。そこをプログラムに任せることで、「次はどんな表情のキャラを描こうか?」という創作活動に全てのエネルギーを注げるようになりました。

「自分専用ツール」があるというエンジニアの愉しみ

世の中には便利な汎用ツールがたくさんありますが、「自分の描き方のクセ(3×3グリッド)」に最適化されたツールを自作するのは、エンジニアとして非常に気持ちの良い体験です。

  • 思い立ったらすぐに修正できる(余白の調整など)
  • 他のプロジェクトへの転用が効く(ブログ用アイコン作成など)
  • 作業の「儀式」が楽しくなる

まさに、「面倒くさい」という感情こそが、最高のツールを生み出す原動力であることを改めて実感しました。

補足:次のステップ

現在はコマンドラインからの実行ですが、以前このブログでも紹介した「Flet」などを使ってGUI化すれば、さらに直感的な「スタンプ制作専用機」に進化させられそうです。自動化の追求に終わりはありませんね。

 

今回の自動化ツールが完成するまでには、さまざまな試行錯誤がありました。私が実際にスタンプ制作に挑戦し、申請・承認されるまでの過程をシリーズで公開しています。

「自分もスタンプを作ってみたい」という方や、「具体的にどう描いているのか?」が気になる方は、ぜひ以下の記事もあわせてご覧ください。

LINEスタンプ制作の記録

これらのステップを経て、最後に辿り着いたのが今回の「Pythonによる作業効率の極大化」です。一連の流れを知ることで、なぜ自動化が必要だったのか、より深く理解いただけるはずです。

 

今回は、Pythonを使ってLINEスタンプ制作を効率化する方法をご紹介しました。一見すると小さな自動化ですが、その積み重ねが創作活動に大きなゆとりをもたらしてくれます。

今回のまとめ

  • 単純作業の自動化:10分かかっていた透過・分割作業が1秒で完了する。
  • クオリティの安定:プログラム処理により、切り出し位置のズレや透過漏れといったミスが防げる。
  • エンジニアリングの応用:自分の作業スタイル(3×3グリッド)に合わせた最適化が、最も効果的な時短になる。

「めんどくさい」を放置せず、コードで解決する。これが、楽しく創作を続けるための秘訣です。

次回の予告:さらなる自動化へ

実は、今回の透過・分割ツールの先にある「さらに面倒な工程」の自動化にもすでに成功しています。

具体的には、「LINEスタンプ規定サイズへのリサイズ」から「申請用のZipファイル化」までを一括で行うコードです。スタンプ制作の最終盤、1枚ずつサイズを確認して固める作業も、もう手作業でやる必要はありません。

こちらのコードについても、近いうちに解説記事として公開する予定です。「スタンプ制作完全自動化計画」の続報を楽しみにお待ちください!

それでは、良き自動化ライフを!