AI漫剧制 | 第 11 天:ComfyUI 节点式漫画工作流入门

第 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)进一步增强面部一致性。


总结

  1. ComfyUI 是专业漫画创作者的必备工具——节点式工作流让复杂的漫画管线变得可搭建、可复用、可分享
  2. 核心管线是 Checkpoint → ControlNet → IP-Adapter → KSampler → VAE Decode,每个环节都可独立控制
  3. 使用 YAML 定义分镜大纲 + Python 脚本批量调用 API,可实现从故事到漫画页面的半自动化生产
  4. 自定义节点生态是 ComfyUI 的灵魂——ControlNet Aux、WAS Node Suite、IP-Adapter Plus 是漫画制作的三件套
  5. 工作流可导出为 JSON/PNG 分享,方便团队协作和版本管理

下一篇文章将深入 ControlNet 在漫画中的具体应用——姿态控制、边缘检测、深度图、涂鸦控制等高级技巧,敬请期待!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容