第 11/60 天
引言
对于刚接触 AI 漫画制作的创作者来说,Stable Diffusion WebUI 的直观界面已经足够友好。但当你需要更精细的控制、更复杂的管线、或者想要搭建可复用的漫画生成流水线时,ComfyUI 才是真正的利器。它采用节点式(Node-based)可视化编程范式,将每个 AI 处理步骤拆解为独立节点,通过连线组合成完整的工作流。
ComfyUI 的优势在于:
– 完全可控:每个参数、每个模型、每个中间结果都可手动连接
– 内存效率高:只加载你需要的模型,不浪费显存
– 可复现性强:工作流可以导出为 JSON/PNG,分享即复现
– 漫画工作流天然适配:分镜、角色、背景、后处理均可模块化
本文将从零开始,带你搭建完整的一套 ComfyUI 漫画单页生成工作流,包含角色一致性、分镜控制和批量输出。
核心概念
节点(Node)与节点图(Node Graph)
在 ComfyUI 中,每个节点代表一个处理单元——加载模型、生成图像、放大、遮罩、融合等。节点之间有输入/输出插口(Socket),用线连接即可传递数据。
| 节点类型 | 功能 | 漫画制作中的用途 |
|---|---|---|
| CheckpointLoader | 加载 Stable Diffusion 主模型 | 加载漫画风格模型 |
| CLIPTextEncode | 编码提示词 | 输入画面描述、角色描述 |
| KSampler | 执行采样生成 | 生成漫画图像 |
| VAE Decode/Encode | 图像与潜空间互转 | 图像解码输出 |
| ControlNetLoader | 加载 ControlNet 模型 | 姿态控制、边缘控制 |
| LoadImage | 加载参考图 | 加载角色参考图、线稿 |
| IPAdapter | 图像提示适配 | 保持角色一致性 |
| ImageResize | 调整图像尺寸 | 统一漫画分格尺寸 |
| SaveImage | 保存图像 | 输出漫画页面 |
关键工作流概念
Checkpoint → CLIP → KSampler → VAE Decode → SaveImage 是最基础的生成管线。漫画工作流在此基础上加入 ControlNet(控制姿态/构图)、IP-Adapter(角色一致性)、LoRA(风格/角色微调)等节点。
ComfyUI 与 WebUI 对比
| 维度 | Stable Diffusion WebUI | ComfyUI |
|---|---|---|
| 学习曲线 | 低,即开即用 | 较高,需理解节点图 |
| 灵活性 | 固定管线,有限扩展 | 无限组合,任意连接 |
| 显存效率 | 加载所有模型 | 按需加载 |
| 工作流复用 | 导出图片设置 | 导出 JSON/PNG 工作流 |
| 批量处理 | 脚本扩展 | 原生节点串联 |
| 漫画制作 | 手动逐张生成 | 搭建管线自动批量 |
实战步骤
1. 安装 ComfyUI
# 通过 git 克隆 ComfyUI
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI
# 安装依赖
pip install -r requirements.txt
# 启动 ComfyUI
python main.py --listen 0.0.0.0 --port 8188
# 访问 http://localhost:8188 即可看到节点编辑器界面
提示:推荐使用
--gpu-only参数将模型全部加载到 GPU,或用--highvram提升性能。
2. 安装漫画制作所需的自定义节点
ComfyUI 的生态通过自定义节点(Custom Nodes)扩展。漫画制作需要安装以下节点包:
cd ComfyUI/custom_nodes
# ControlNet 辅助节点(姿态控制、Canny 边缘检测等)
git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git
# WAS Node Suite(图像处理工具集:遮罩、放大、融合)
git clone https://github.com/WASasquatch/was-node-suite-comfyui.git
# IP-Adapter 节点(角色一致性)
git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git
# ComfyUI Manager(管理节点和模型)
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
# 安装全部依赖后重启 ComfyUI
pip install -r comfyui_controlnet_aux/requirements.txt
pip install -r was-node-suite-comfyui/requirements.txt
3. 下载漫画风格模型与 ControlNet
# 模型存放路径
cd ComfyUI/models
# 下载漫画风格 Checkpoint 模型(以 Niji 风格为例)
# 将下载的 .safetensors 放入 models/checkpoints/
# 推荐:meinamix, counterfeit, anything-v5, niji-express
# 下载 ControlNet 模型(放入 models/controlnet/)
# control_v11p_sd15_openpose.pth — 姿态控制
# control_v11p_sd15_canny.pth — 边缘检测控制
# control_v11f1p_sd15_depth.pth — 深度图控制
# 下载 IP-Adapter 模型(放入 models/ipadapter/)
# ip-adapter-plus_sd15.safetensors
# ip-adapter-faceid-plusv2_sd15.bin
4. 搭建漫画单页生成工作流(JSON 配置)
以下是一个完整漫画单页工作流的 JSON 定义。你可以将其导入 ComfyUI:
{
"comfyui_workflow": {
"name": "漫画单页生成管线",
"description": "包含角色参考、姿态控制、背景生成、分格布局的漫画单页管线",
"nodes": [
{
"id": 1,
"type": "CheckpointLoaderSimple",
"inputs": {
"ckpt_name": "meinamix_v11.safetensors"
}
},
{
"id": 2,
"type": "CLIPTextEncode",
"inputs": {
"text": "manga panel, a young hero standing in a futuristic city, dramatic lighting, detailed background, cinematic composition, masterpiece, high quality, best quality",
"clip": ["1", "clip"]
}
},
{
"id": 3,
"type": "CLIPTextEncode",
"inputs": {
"text": "low quality, bad anatomy, distorted hands, ugly, watermark, text, blurry",
"clip": ["1", "clip"]
}
},
{
"id": 4,
"type": "ControlNetLoader",
"inputs": {
"control_net_name": "control_v11p_sd15_openpose.pth"
}
},
{
"id": 5,
"type": "LoadImage",
"inputs": {
"image": "pose_reference.png"
}
},
{
"id": 6,
"type": "IPAdapterLoader",
"inputs": {
"ipadapter_name": "ip-adapter-plus_sd15.safetensors"
}
},
{
"id": 7,
"type": "LoadImage",
"inputs": {
"image": "character_ref.png"
}
},
{
"id": 8,
"type": "KSampler",
"inputs": {
"seed": 42,
"steps": 30,
"cfg": 7.0,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1.0
}
},
{
"id": 9,
"type": "VAEDecode",
"inputs": {
"vae": ["1", "vae"]
}
},
{
"id": 10,
"type": "SaveImage",
"inputs": {
"filename_prefix": "manga_panel_001"
}
}
]
}
}
5. 使用 Python 脚本批量生成漫画页面
ComfyUI 提供了 API 模式,允许通过 Python 脚本批量调用工作流:
import json
import requests
import os
from PIL import Image
# ComfyUI API 配置
COMFYUI_URL = "http://localhost:8188"
WORKFLOW_FILE = "manga_workflow.json"
OUTPUT_DIR = "comic_pages"
def queue_prompt(workflow):
"""将工作流发送到 ComfyUI 队列"""
payload = {
"prompt": workflow
}
response = requests.post(
f"{COMFYUI_URL}/prompt",
json=payload
)
return response.json()
def wait_for_completion(prompt_id):
"""等待生成完成"""
import time
while True:
response = requests.get(
f"{COMFYUI_URL}/history/{prompt_id}"
)
if response.status_code == 200 and response.json():
return response.json()[prompt_id]
time.sleep(1)
def generate_comic_page(scene_description, character_ref, pose_ref, page_num, panel_num):
"""生成漫画单格"""
# 加载工作流模板
with open(WORKFLOW_FILE, 'r') as f:
workflow = json.load(f)
# 修改提示词节点
workflow["2"]["inputs"]["text"] = (
f"manga panel, {scene_description}, "
f"detailed, high quality, masterpiece, best quality"
)
# 修改角色参考图路径
workflow["7"]["inputs"]["image"] = character_ref
workflow["5"]["inputs"]["image"] = pose_ref
# 设置随机种子(每格不同)
import random
workflow["8"]["inputs"]["seed"] = random.randint(1, 999999999)
# 提交生成
result = queue_prompt(workflow)
prompt_id = result.get("prompt_id")
wait_for_completion(prompt_id)
# 输出文件会被保存到 ComfyUI/output/
print(f"Page {page_num}, Panel {panel_num} 生成完成: {prompt_id}")
# 示例:生成 4 格漫画页面
panels = [
"hero walking through a futuristic city street, neon lights, rain",
"hero encounters a mysterious figure in a dark alley, dramatic lighting",
"close-up of hero's determined face, intense expression",
"epic showdown, energy beams, explosions, wide angle"
]
for i, panel in enumerate(panels):
generate_comic_page(
scene_description=panel,
character_ref="char_hero_01.png",
pose_ref=f"pose_panel_{i+1}.png",
page_num=1,
panel_num=i+1
)
6. 使用 YAML 定义漫画分镜大纲
为了系统化管理漫画内容,可以先用 YAML 定义分镜大纲,再脚本化生成:
# comic_chapter_01.yaml
chapter:
title: "未来都市的觉醒"
page_count: 4
style: "meinamix_v11"
character_refs:
hero: "char_hero_01.png"
villain: "char_villain_01.png"
pages:
- page: 1
panels:
- description: "hero walking through futuristic city street, neon lights, rain"
character: "hero"
pose: "pose_stand.png"
control: "openpose"
- description: "wide shot of city skyline, flying cars, massive holograms"
character: null
pose: null
control: "canny"
- description: "hero notices strange figure in crowd, shocked expression"
character: "hero"
pose: "pose_surprise.png"
control: "openpose"
- page: 2
panels:
- description: "close-up of villain's masked face, red eyes glowing"
character: "villain"
pose: "pose_menacing.png"
control: "openpose"
- description: "crowd fleeing in panic, chaos on the streets"
character: null
pose: null
control: "depth"
- description: "hero pushes through crowd, determined expression"
character: "hero"
pose: "pose_run.png"
control: "openpose"
7. 一键生成整本漫画
将 YAML 分镜大纲转化为批量生成脚本:
#!/bin/bash
# batch_comic_gen.sh — 一键生成整本漫画
WORKFLOW_TEMPLATE="manga_workflow.json"
CHAPTER_YAML="comic_chapter_01.yaml"
OUTPUT_DIR="comic_output"
mkdir -p "$OUTPUT_DIR"
# 使用 Python 解析 YAML 并调用 ComfyUI API
python3 << 'PYEOF'
import yaml
import json
import requests
import os
import time
import random
with open("comic_chapter_01.yaml", 'r') as f:
chapter = yaml.safe_load(f)
with open("manga_workflow.json", 'r') as f:
workflow_template = json.load(f)
for page in chapter['pages']:
page_num = page['page']
for idx, panel in enumerate(page['panels']):
panel_num = idx + 1
workflow = json.loads(json.dumps(workflow_template))
# 设置提示词
workflow["2"]["inputs"]["text"] = (
f"manga panel, {panel['description']}, "
f"detailed, high quality, best quality"
)
# 设置角色参考
if panel.get('character'):
ref_file = chapter['character_refs'].get(panel['character'])
if ref_file:
workflow["7"]["inputs"]["image"] = ref_file
# 设置姿态参考
if panel.get('pose'):
workflow["5"]["inputs"]["image"] = panel['pose']
# 随机种子
workflow["8"]["inputs"]["seed"] = random.randint(1, 999999999)
# 提交
payload = {"prompt": workflow}
resp = requests.post("http://localhost:8188/prompt", json=payload)
result = resp.json()
print(f"Page {page_num}, Panel {panel_num}: {result.get('prompt_id')} submitted")
time.sleep(0.5)
print("所有分镜已提交至 ComfyUI 队列,等待生成完成...")
PYEOF
echo "批量生成任务已提交!"
常见问题
Q1: ComfyUI 相比 WebUI 难学,值得花时间吗?
值得。 如果你只是偶尔生成几张图片,WebUI 已经足够。但如果你要认真做 AI 漫画——需要批量生成、角色一致性、复杂的 ControlNet 管线、可复现的工作流——ComfyUI 的投入产出比极高。学习曲线通常 1-3 天即可上手。
Q2: 为什么我的 ComfyUI 生成速度比 WebUI 慢?
可能原因:缺少 --gpu-only 参数导致模型在 CPU/GPU 间切换;VAE 解码方式不同(ComfyUI 默认使用 tiling,可以在 KSampler 中关闭);同时加载了过多自定义节点。建议仅加载漫画制作必需的节点。
Q3: 如何将 WebUI 的 LoRA 和模型迁移到 ComfyUI?
模型文件(.safetensors / .ckpt)完全兼容,只需复制到 ComfyUI 对应目录下。LoRA 使用 LoadLoRA 节点加载,语法与 WebUI 相同。<lora:name:weight> 格式在 ComfyUI 中通过节点参数输入。
Q4: 工作流导出后别人打不开怎么办?
确保对方安装了相同的自定义节点和模型版本。推荐使用 ComfyUI Manager 的「Install Missing Custom Nodes」功能自动补全。工作流中嵌入的节点 ID 在不同安装中可能不同,建议导出的 PNG 中包含原始工作流信息(ComfyUI 默认会在 PNG 元数据中写入)。
Q5: 漫画批量生成时常出现角色不一致怎么办?
这是 ComfyUI 的优势领域——通过 IP-Adapter 节点传入角色参考图,配合固定种子和控制网,可以大幅提升一致性。建议为每个角色准备 3-5 张多角度参考图,在不同场景中混用,并配合 FaceID 节点(IPAdapter FaceID)进一步增强面部一致性。
总结
- ComfyUI 是专业漫画创作者的必备工具——节点式工作流让复杂的漫画管线变得可搭建、可复用、可分享
- 核心管线是 Checkpoint → ControlNet → IP-Adapter → KSampler → VAE Decode,每个环节都可独立控制
- 使用 YAML 定义分镜大纲 + Python 脚本批量调用 API,可实现从故事到漫画页面的半自动化生产
- 自定义节点生态是 ComfyUI 的灵魂——ControlNet Aux、WAS Node Suite、IP-Adapter Plus 是漫画制作的三件套
- 工作流可导出为 JSON/PNG 分享,方便团队协作和版本管理
下一篇文章将深入 ControlNet 在漫画中的具体应用——姿态控制、边缘检测、深度图、涂鸦控制等高级技巧,敬请期待!















暂无评论内容