PNGTuber用の表情差分画像を簡単に作成するツールです。
- 位置合わせ余白の自動トリミングを追加しました。
mask_composer.py/parts_mixer.py/simple_aligner_app.pyの保存時に、位置合わせで生じた端の空白を自動で除去できます。 - 保存欄の 「位置合わせ余白を自動トリミング」 をONにし、必要に応じて マージン(px) を調整してください。
- 余白を最小化したい場合は、マージンを
0pxに設定してください。
- 目と口を別々のソースから選んで4パターン自動生成
- 2x2 表情シートから分割&位置合わせ
- AKAZE / ORB 特徴点マッチングによる高精度位置合わせ
- 位置合わせで発生した余白を自動トリミングして保存
- 位置合わせスコア/成功率のステータス可視化
- 低スコア画像への再試行導線(しきい値・ジャンプ)
- ツール設定の自動保存(前回ディレクトリ/主要UI設定)
- オーバーレイ表示で差分確認しながらマスク描画
- 日本語ファイルパス対応
- シンプルなGUI(PySide6)
まず 表情差分シート(2x2の表情バリエーション画像)を用意する必要があります(Step 2 参照)。
# リポジトリをダウンロードまたはクローン
git clone https://github.com/rotejin/EasyPNGTuber.git
cd EasyPNGTuber
# 依存パッケージをインストール(仮想環境も自動作成)
uv sync-
キャラクター画像を用意
- PNGTuberにしたいキャラクターの画像(1枚)を用意します
-
Grid Tilerで2x2画像を作成
uv run python grid_tiler.py
- 用意した画像をドラッグ&ドロップ
- 「タイリング画像を保存」で2x2画像を出力
-
AIで表情差分を生成
- Google AI Studio の画像生成AI(Nano Banana)を使用
- 2x2画像をアップロードし、以下のプロンプトで表情差分を生成:
プロンプトを表示(クリックで展開)
expression_sheet: task: "edit_reference_image" format: grid: "2x2" preserve: "exact_pixel_position" critical_rule: source: "use provided reference image as base" maintain: - original_art_style - original_character_design - original_face_angle - original_head_tilt - original_color_palette - original_lighting - original_line_weight do_not_change: - head_position - face_outline - hair - background - overall_composition editable_elements: - eyelids_only - mouth_only parts_definition: eyes: open: "natural relaxed open state" closed: "gentle blink, relaxed eyelids" mouth: closed: "lips together, neutral" open: "natural speaking, showing inside" panels: top_left: action: "keep_unchanged" top_right: eyes: "open" mouth: "open" bottom_left: eyes: "closed" mouth: "closed" bottom_right: eyes: "closed" mouth: "open"
uv run python parts_mixer.py生成された表情差分シートをParts Mixerで読み込み、目と口のパーツを組み合わせてPNGTuber用の4パターンを出力します。
目と口のパーツを別々のソース画像から選択し、4パターン(目ON/OFF × 口ON/OFF)を自動生成します。
AI画像生成で表情差分を一括生成した際、一部のパーツが期待通りにならない場合に便利です。
uv run python parts_mixer.py- 表情シートをドラッグ&ドロップ
- 「分割&位置合わせ」を実行
- ベース画像 / 目ソース / 口ソースをそれぞれ選択(ベースが目閉じ口閉じの場合、目ソースは目開き、口ソースは口開きを選ぶ)
- 目キャンバスで目の領域をマスク
- 口キャンバスで口の領域をマスク
- 4パターンがプレビューに表示
- 「4パターン一括保存」で出力
{元画像名}_eyeOFF_mouthOFF.png- 目OFF 口OFF{元画像名}_eyeON_mouthOFF.png- 目ON 口OFF{元画像名}_eyeOFF_mouthON.png- 目OFF 口ON{元画像名}_eyeON_mouthON.png- 目ON 口ON
sample/ フォルダに動作確認用のサンプル画像が含まれています。
tomari_sample.png- 2x2表情シートのサンプル
- Python 3.10以上がインストールされているか確認
.venvフォルダを削除してuv syncを再実行
- 対応形式: PNG, JPG, BMP, WebP
- 日本語ファイル名も対応しています
- 画像の差異が大きすぎる場合は失敗することがあります
- 回転角が±30度を超える場合は対応できません
- 保存時に「位置合わせ余白を自動トリミング」をONにしてください
- 必要に応じて「マージン(px)」で余白量を微調整できます
- AKAZE特徴点マッチング(メイン)
- ORB(フォールバック)
- RANSAC によるアフィン変換推定
- AKAZE/ORBともにバイナリ記述子に適した距離指標でマッチング
- 変換時に有効領域マスク(元画像由来の画素)を同時生成
- 保存時に複数画像の有効領域の共通部分を自動トリミング
- 全出力で同一矩形を使うため、PNGTuber用フレームサイズを維持
| パラメータ | 値 |
|---|---|
| 最大回転角 | ±30度 |
| スケール範囲 | 0.8~1.2倍 |
| 成功スコア閾値 | 0.6以上 |
| 項目 | 要件 |
|---|---|
| Python | 3.10 以上 |
| OS | Windows / macOS / Linux |
| パッケージ管理 | uv 推奨 |
EasyPNGTuber/
├── parts_mixer.py # メインツール: パーツ合成
├── grid_tiler.py # 画像タイリング
├── mask_composer.py # マスク合成
├── simple_aligner_app.py # 位置合わせ
├── aligner.py # 位置合わせエンジン
├── compositor.py # 画像合成エンジン
├── cv2_utils.py # OpenCVユーティリティ
├── mask_canvas.py # マスクキャンバスUI
├── preview_widget.py # プレビューUI
├── gemini_prompt.txt # AI用プロンプト
├── pyproject.toml # 依存パッケージ定義
└── sample/ # サンプル画像
Copyright (c) 2026 rotejin