CC以外でクリスタ/漫画仕上げを確実自動化する手段(Krita/AHK/ComfyUI)


Windows環境において、GUIを1クリックもせず、AI生成のカラーエロ漫画画像を「線画抽出+スクリーントーン化(モノクロ化)」して確実にPNG書き出しする3つのアプローチを解説します。

---

### ① Krita + Python API(完全ヘッドレス・バックグラウンド処理)

Kritaは強力なPython APIを備えており、GUIを一切表示させない「ヘッドレスモード」でのバッチ処理が可能です。フォーカス問題は100%発生しません。

#### 実装手順
1. **スクリプトの準備**
以下のPythonコードを `krita_manga.py` として保存します。

```python
# krita_manga.py
import os
import sys
from krita import Krita

def process():
# 環境変数から入出力パスを取得(引数パースの競合を防ぐため)
input_path = os.environ.get("KRITA_INPUT")
output_path = os.environ.get("KRITA_OUTPUT")

if not input_path or not output_path:
print("Error: KRITA_INPUT or KRITA_OUTPUT env variables not set.")
return

ki = Krita.instance()
# ドキュメントを非表示(Background)で開く
doc = ki.openDocument(input_path)
if not doc:
print(f"Failed to open image: {input_path}")
return

# 1. 線画抽出 (エッジ検出フィルターの適用)
edge_filter = ki.filter("edge detection")
# 設定(必要に応じて調整)
edge_filter.apply(doc.activeNode(), 0, 0, doc.width(), doc.height())

# 2. ハーフトーン化(網点トーン)
halftone_filter = ki.filter("halftone")
if halftone_filter:
# トーンのサイズや形状を設定可能
halftone_filter.apply(doc.activeNode(), 0, 0, doc.width(), doc.height())

# 投影の更新
doc.refreshProjection()

# 3. PNG書き出し
doc.setBatchmode(True)
doc.saveAs(output_path)
doc.close()

# Kritaを終了
ki.action("file_quit").trigger()

# Krita起動時に即時実行
process()
```

2. **起動用バッチファイル(PowerShell)の作成**
Kritaをバックグラウンド(`--nosplash`)で起動し、上記スクリプトを実行させるバッチです。

```powershell
# run_krita.ps1
$env:KRITA_INPUT="C:\manga\input_color.png"
$env:KRITA_OUTPUT="C:\manga\output_mono.png"

# Kritaをバックグラウンドで起動し、スクリプトを実行
Start-Process -FilePath "C:\Program Files\Krita (x64)\bin\krita.exe" -ArgumentList "--nosplash --run-custom-script --script C:\manga\krita_manga.py" -NoNewWindow -Wait
```

---

### ② AutoHotkey + クリスタEX(ControlSendによる完全非アクティブ制御)

クリスタ(CLIP STUDIO PAINT)は、`ControlSend` を使うことで**ウィンドウを背後に隠したまま(非アクティブのまま)**ショートカットキーを送り、オートアクションを実行できます。

#### 前提条件(クリスタ側の準備)
1. クリスタで「カラー画像をモノクロ化(レイヤープロパティをトーン化)して、特定フォルダに『上書き保存』し、キャンバスを閉じる」という**オートアクション**を作成します。
2. そのオートアクションにショートカットキー(例: `F12`)を割り当てておきます。

#### 実装手順
以下のAHKスクリプト(`clip_auto.ahk`)を作成し、実行します。

```autohotkey
#NoEnv
#NoTrayIcon
SetTitleMatchMode, 2
DetectHiddenWindows, On

; 入力画像パス
InputFile := "C:\manga\input_color.png"
OutputFile := "C:\manga\output_mono.png"

; 競合防止のため既存の出力を削除
if FileExist(OutputFile)
FileDelete, %OutputFile%

; クリスタを最小化/非アクティブ状態で起動し、直接画像を開く
Run, "C:\Program Files\CELSYS\CLIP STUDIO\CLIP STUDIO PAINT\CLIPStudioPaint.exe" "%InputFile%", , Min

; ウィンドウの出現を待つ (非アクティブのまま検出)
WinWait, ahk_exe CLIPStudioPaint.exe, , 15
if ErrorLevel {
ExitApp
}
hWnd := WinExist("ahk_exe CLIPStudioPaint.exe")

; 描画エンジンの読み込み完了まで安全マージンとして待機
Sleep, 3000

; ControlSendで、クリスタのメインウィンドウへ直接「F12(オートアクション)」を送信
; ウィンドウが非アクティブでも、裏で確実にキーが届きます
ControlSend, , {F12}, ahk_id %hWnd%

; オートアクションによる書き出し完了(ファイル生成)を監視
Loop, 30 {
if FileExist(OutputFile) {
break
}
Sleep, 500
}

; クリスタをプロセスごと強制終了(GUIの「保存しますか?」等のダイアログを無視して確実に閉じる)
Process, Close, CLIPStudioPaint.exe
ExitApp
```

---

### ③ ComfyUI(API駆動による線画化+トーン化)

ComfyUIは、GUIを一切開かずに「API(JSONデータ)」をローカルサーバーにPOSTするだけで画像の変換・保存が完結します。最も近未来的かつ極めて確実な自動化手段です。

#### 必要なカスタムノード
* `comfyui_controlnet_aux`(Anyline Preprocessor用:超美麗な線画抽出)
* `ComfyUI-Post-Processing-Nodes` または `comfyui-image-filters`(Halftone / Dither用:高精度な網点化)

#### 実装手順
1. **ワークフローJSONの取得**
ComfyUIのGUI上で「Load Image」→「Anyline Preprocessor」→「Dither (Halftone)」→「Save Image」のノードを繋ぎ、右メニューから「**Save (API Format)**」(※設定からEnable Dev modeを有効化)で `workflow_api.json` を書き出します。

2. **PythonからAPIを叩くバッチスクリプト**
このスクリプトを実行するだけで、裏で起動しているComfyUIに画像が送られ、処理されたトーン画像が自動で保存されます。

```python
# comfy_batch.py
import json
import urllib.request
import os

COMFY_ADDRESS = "http://127.0.0.1:8188"
INPUT_IMG_PATH = "C:/manga/input_color.png"
JSON_WORKFLOW_PATH = "C:/manga/workflow_api.json"

# 1. 画像をComfyUIのinputフォルダにアップロード
import requests
with open(INPUT_IMG_PATH, 'rb') as f:
res = requests.post(f"{COMFY_ADDRESS}/upload/image", files={"image": f})
uploaded_filename = res.json()["name"]

# 2. ワークフローJSONの読み込みと書き換え
with open(JSON_WORKFLOW_PATH, 'r', encoding='utf-8') as f:
prompt = json.load(f)

# LoadImageノード(通常はID "3"等)の画像名をアップロードしたものに変更
# ※ノードIDは保存したJSONを確認してください
prompt["3"]["inputs"]["image"] = uploaded_filename

# 3. ジョブをキューに送信
p = {"prompt": prompt}
data = json.dumps(p).encode('utf-8')
req = urllib.request.Request(f"{COMFY_ADDRESS}/prompt", data=data)
urllib.request.urlopen(req)

print("Processing in ComfyUI backend...")
```

---

### 3つの手段の比較評価

| 項目 | ① Krita + Python API | ② AutoHotkey + クリスタ | ③ ComfyUI (API) |
| :--- | :--- | :--- | :--- |
| **導入の手間** | **中** (Pythonコード作成のみ) | **中** (クリスタのオートアクション構築) | **高** (ComfyUIとカスタムノードの構築) |
| **処理の確実性** | **極めて高** (API直接操作) | **中** (ポップアップ等で稀に止まる) | **最高** (HTTP通信のみで完結、100%確実) |
| **NSFW可否** | **完全可能** (ローカル・制限なし) | **完全可能** (ローカル・制限なし) | **完全可能** (ローカル・制限なし) |
| **線画/トーン品質**| **普通** (標準的な2Dフィルタ) | **高** (プロ仕様のトーン化) | **最高** (Anylineによる異次元の線画抽出) |

---

### 結論:一番ラクで確実なのはどれか?

一番ラクで確実なのは **「① Krita + Python API」** です。

* **理由**:
* **ComfyUI (③)** も確実性・品質は最高クラスですが、初回の環境構築(ControlNetモデルのダウンロード、API用JSONの調整)にかなりの手間がかかります。
* **クリスタ (②)** は、何らかの理由で「ファイルを保存しますか?」などのダイアログが一度でも裏で出るとプロセスの停止・ハングに繋がるため、完全放置時の「確実性」に不安が残ります。
* **Krita (①)** は、無料かつインストーラー1つで環境が揃い、Pythonからダイレクトに画像処理エンジンを実行できるため、**「GUIの割り込みトラブルが一切なく、最も少ないエンジニアリングコストで100%確実に動作するシステム」** を構築できます。