こんにちは、Tomaです。今回はPythonを使って、手持ちのイラスト素材からLINEアニメーションスタンプ規格のAPNGを作成する方法を解説します。
自作プログラムでスタンプを作る際、避けて通れないのが「厳しい容量制限」との戦いです。実際にコードを動かしながら、その挙動を検証してみました。
- 第1章:LINEアニメーションスタンプの制約条件
- 第2章:環境構築とディレクトリ構成
- 第3章:実装コード (anime_Pillow.py)
- 第4章:サイズ削減!最適化オプション適用版
- まとめ:ファイルサイズ増大の謎と次なる一歩
第1章:LINEアニメーションスタンプの制約条件
LINEスタンプとして登録するためには、以下の条件をクリアする必要があります。個人で作成する際も、この数値を意識するのがベストです。
- 再生時間:1~4秒
- フレーム数:5~20枚(奇数推奨)
- ファイル容量:1個あたり300KB以下、1MB以下(訂正します💦)
今回は「1→2→1→2→1」の5枚構成、再生時間3秒(200ms×5枚×3ループ)という、規格にジャストフィットする設定で作成しました。
第2章:環境構築とディレクトリ構成
このプログラムを動かすには、画像処理ライブラリのPillowが必要です。以下のコマンドを実行してインストールしてください。
pip install Pillow
作業ディレクトリの状態は、以下のようになります。画像ファイルと実行スクリプトを同じフォルダに置いてください。
Project/ ├── anime_Pillow.py # 実行スクリプト ├── 01.png # 元画像(118KB) ├── 02.png # 元画像(131KB) └── loop_animation.png # 生成されるAPNG
第3章:実装コード (anime_Pillow.py)
まずは基本となる書き出しコードです。元画像は「01.png」「02.png」の2枚を使用します。

from PIL import Image
# 画像の読み込み(透過を維持するためにRGBAへ変換)
img1 = Image.open('01.png').convert('RGBA')
img2 = Image.open('02.png').convert('RGBA')
# 1->2->1->2->1 の5枚構成でリストを作成
frames = [img1, img2, img1, img2, img1]
# APNGとして保存
frames[0].save(
'loop_animation.png',
save_all=True,
append_images=frames[1:],
duration=200,
loop=3
)
print("作成完了!")
第4章:サイズ削減!最適化オプション適用版
標準設定では611KBだったファイルサイズを削減するため、optimize=Trueを追加した改善版コードがこちらです。
from PIL import Image
img1 = Image.open('01.png').convert('RGBA')
img2 = Image.open('02.png').convert('RGBA')
frames = [img1, img2, img1, img2, img1]
# 保存時に最適化オプションを追加
frames[0].save(
'loop_animation_optimized.png',
save_all=True,
append_images=frames[1:],
duration=200,
loop=3,
optimize=True # これで495KBまで削減!
)
print("最適化版の作成完了!")
まとめ:ファイルサイズ増大の謎と次なる一歩
結果として、495KBまで削減できましたが、元画像2枚の合計(249KB)より大きく、LINEの300KB制限にはまだ一歩及びませんでした。Pillowの標準機能だけでは、フレーム間の差分抽出に限界があるようです。

ここから先は「減色処理」や「外部ツールとの連携」が必要になりそうです。完璧なスタンプ作成を目指して、研究を続けていきます!
追記:実はLINEアニメーションスタンプは1MB以下に現在はなっています。古い資料を見たようで大変申し訳ありません。ですが、軽量化の話は続けていきます。