ComfyUI AI绘图工作流完全教程

教程简介

零基础ComfyUI AI绘图工作流完全教程,涵盖ComfyUI安装部署、节点系统详解、Stable Diffusion模型加载、文生图/图生图工作流、ControlNet精确控制、LoRA模型融合、IP-Adapter风格迁移、AnimateDiff视频生成、自定义节点开发、工作流优化与共享等核心技能,配有完整AI绘图工作流实战项目,适合AI创作者和设计师系统学习。

ComfyUI AI绘图工作流完全教程

🎨 适用人群:AI绘画爱好者、设计师、摄影师、内容创作者 ⏱️ 预计学习时间:6-8小时 📋 前置要求:基本的电脑操作能力,了解Stable Diffusion基础概念 💻 硬件要求:NVIDIA GPU,建议8GB+显存(最低4GB可用低显存模式)


📑 目录

  1. ComfyUI概述与优势对比
  2. 安装部署
  3. 界面详解与基本操作
  4. 节点系统核心概念
  5. 文生图 Text-to-Image 工作流
  6. 图生图 Image-to-Image 工作流
  7. ControlNet 精确控制
  8. IP-Adapter 风格迁移
  9. LoRA 模型加载与融合
  10. 图像修复 Inpainting
  11. AnimateDiff 视频生成
  12. 自定义节点开发
  13. 工作流导入导出与共享
  14. 性能优化与显存管理
  15. 常见问题排查
  16. 实战项目:完整AI绘图工作流搭建

1. ComfyUI概述与优势对比

1.1 什么是ComfyUI

ComfyUI 是一个基于节点式工作流的 Stable Diffusion 图形界面工具,由 Comfyanonymous 于2023年开发。与传统的 WebUI 不同,ComfyUI 将 AI 绘图的每个步骤(加载模型、编码提示词、采样、解码等)拆解为独立的节点(Node),用户通过连线将节点组合成完整的工作流。

1.2 ComfyUI vs 其他工具

特性 ComfyUI Automatic1111 WebUI Fooocus
界面类型 节点式/图形化 传统表单式 简化表单式
灵活性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
学习曲线 较陡峭 中等 简单
工作流复用 原生支持JSON导出 依赖插件 不支持
显存占用 较低(智能调度) 中等 中等
扩展性 极强(自定义节点) 强(插件系统) 有限
批量处理 原生支持 需要脚本 有限
版本控制 工作流即代码 困难 不支持
社区生态 活跃且快速增长 成熟稳定 较新

1.3 选择ComfyUI的理由

  1. 可视化工作流:一目了然地看到数据如何在各节点间流动
  2. 极致灵活性:任何工作流都可以通过节点组合实现
  3. 高性能:智能的显存管理和批处理优化
  4. 可复现:工作流导出为JSON,完美版本控制
  5. 社区丰富:数千个自定义节点扩展功能
  6. 持续更新:紧跟最新的AI模型和技术

2. 安装部署

2.1 Windows 安装

方法1:一键安装包(推荐新手)

# 1. 从GitHub下载最新发布版本
# 访问:https://github.com/comfyanonymous/ComfyUI/releases
# 下载 ComfyUI_windows_portable.zip

# 2. 解压到无中文的路径
# 例如:D:\ComfyUI

# 3. 双击运行
# 运行 run_nvidia_gpu.bat(NVIDIA显卡)
# 或 run_cpu.bat(无独立显卡)

# 4. 浏览器自动打开 http://127.0.0.1:8188

方法2:手动安装(推荐有经验的用户)

# 1. 确保已安装Python 3.10+和Git
python --version   # 应显示 3.10.x 或更高
git --version

# 2. 克隆仓库
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI

# 3. 创建虚拟环境
python -m venv venv
venv\Scripts\activate

# 4. 安装PyTorch(根据你的CUDA版本选择)
# CUDA 11.8
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# 5. 安装依赖
pip install -r requirements.txt

# 6. 启动
python main.py

2.2 Linux 安装

# 1. 安装系统依赖(Ubuntu/Debian)
sudo apt update
sudo apt install python3 python3-pip python3-venv git

# 2. 克隆仓库
git clone https://github.com/comfyanonymous/ComfyUI.git
cd ComfyUI

# 3. 创建虚拟环境
python3 -m venv venv
source venv/bin/activate

# 4. 安装PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# 5. 安装依赖
pip install -r requirements.txt

# 6. 启动(支持自定义参数)
python main.py --listen 0.0.0.0 --port 8188

# 常用启动参数:
# --listen 0.0.0.0    允许外部访问
# --port 8188         指定端口
# --lowvram           低显存模式(4-6GB)
# --cpu               使用CPU运行(慢但可用)
# --preview-method auto  启用预览

2.3 Docker 部署

# 1. 拉取官方Docker镜像
docker pull ghcr.io/ai-dock/comfyui:latest

# 2. 运行容器(NVIDIA GPU)
docker run -d \
  --name comfyui \
  --gpus all \
  -p 8188:8188 \
  -v /path/to/models:/workspace/ComfyUI/models \
  -v /path/to/output:/workspace/ComfyUI/output \
  -v /path/to/custom_nodes:/workspace/ComfyUI/custom_nodes \
  ghcr.io/ai-dock/comfyui:latest

# 3. 访问 http://localhost:8188

# 使用docker-compose(推荐)
# docker-compose.yml
version: '3.8'
services:
  comfyui:
    image: ghcr.io/ai-dock/comfyui:latest
    ports:
      - "8188:8188"
    volumes:
      - ./models:/workspace/ComfyUI/models
      - ./output:/workspace/ComfyUI/output
      - ./custom_nodes:/workspace/ComfyUI/custom_nodes
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

2.4 模型文件放置

ComfyUI/
├── models/
│   ├── checkpoints/          # 主模型(SD1.5、SDXL等.safetensors文件)
│   ├── loras/                # LoRA模型
│   ├── vae/                  # VAE模型
│   ├── controlnet/           # ControlNet模型
│   ├── clip/                 # CLIP模型
│   ├── clip_vision/          # CLIP Vision模型(用于IP-Adapter)
│   ├── upscale_models/       # 超分辨率模型
│   ├── animatediff/          # AnimateDiff运动模块
│   ├── ipadapter/            # IP-Adapter模型
│   └── embeddings/           # Textual Inversion嵌入

模型下载推荐来源


3. 界面详解与基本操作

3.1 主界面布局

┌─────────────────────────────────────────────────┐
│  菜单栏:Queue | Save | Load | Manager | Help   │
├─────────────────────────────────────────────────┤
│                                                  │
│         工 作 流 画 布 区 域                       │
│    (在这里拖拽、连接节点)                         │
│                                                  │
│    ┌──────┐        ┌──────┐                      │
│    │节点A │───────→│节点B │                      │
│    └──────┘        └──────┘                      │
│                                                  │
├─────────────────────────────────────────────────┤
│  右键菜单(添加节点) | 底部状态栏                 │
└─────────────────────────────────────────────────┘

3.2 基本操作速查

操作 方式
添加节点 右键画布 → 选择节点类别 → 选择具体节点
连接节点 从输出端口(右侧)拖拽到输入端口(左侧)
删除节点/连线 选中后按 DeleteBackspace
移动画布 按住鼠标中键/右键拖拽
缩放 滚轮滚动
多选 按住 Ctrl 点击节点,或拖拽框选
复制节点 Ctrl+CCtrl+V
撤销 Ctrl+Z
重做 Ctrl+Y
执行工作流 点击右侧 Queue Prompt 按钮
保存工作流 Ctrl+S 或菜单 Save
加载工作流 Ctrl+O 或拖拽JSON文件到画布

3.3 节点颜色与类型

ComfyUI 使用颜色编码区分不同的数据类型:

颜色 数据类型 说明
🟣 紫色 MODEL 模型数据(Checkpoint、LoRA等)
🟡 黄色 CLIP 文本编码器
🟠 橙色 CONDITIONING 条件数据(提示词编码后的结果)
🔴 红色 LATENT 潜空间数据
🔵 蓝色 IMAGE 图像数据
🟢 绿色 VAE VAE编解码器
⚪ 白色 INT/FLOAT/STRING 基础数据类型

4. 节点系统核心概念

4.1 节点的结构

每个节点由三部分组成:

┌─────────────────────────────────┐
│        节点标题                    │
├─────────────────────────────────┤
│ 输入端口(●)  │  参数/设置  │  输出端口(●)
│              │             │
│  ● model     │  [slider]   │  ● MODEL
│  ● clip      │  [dropdown] │  ● CLIP
│  ● vae       │  [text]     │  ● VAE
│              │             │
└─────────────────────────────────┘
  • 输入端口(左侧):接收来自其他节点的数据
  • 输出端口(右侧):将处理结果传递给下游节点
  • 参数控件:可调节的设置(滑块、下拉框、文本框等)

4.2 核心节点详解

# ComfyUI中最常用的节点及其功能:

核心节点 = {
    "Load Checkpoint": "加载主模型(SD1.5/SDXL/Flux等)",
    "CLIP Text Encode": "将文本提示词编码为条件向量",
    "KSampler": "核心采样器,执行扩散去噪过程",
    "Empty Latent Image": "创建空白潜空间图像",
    "VAE Decode": "将潜空间解码为可见图像",
    "Save Image": "保存图像到本地",
    "Load Image": "加载本地图像",
    "KSampler Advanced": "高级采样器,支持更多参数",
    "Upscale Image": "图像超分辨率放大",
    "ControlNet Loader": "加载ControlNet模型",
    "Apply ControlNet": "应用ControlNet控制",
    "Lora Loader": "加载LoRA微调模型",
}

4.3 节点连接规则

# 连接规则:
# 1. 同类型端口才能连接(紫色→紫色,蓝色→蓝色)
# 2. 一个输出端口可以连接多个输入端口(分发)
# 3. 一个输入端口只能接收一个连接(合并需用Merge节点)
# 4. 某些输入是必需的(实线端口),某些是可选的(虚线端口)

# 示例:正确的连接方式
"""
Load Checkpoint
  ├── MODEL output  →  KSampler.model 输入
  ├── CLIP output   →  CLIP Text Encode (正向).clip 输入
  └── CLIP output   →  CLIP Text Encode (反向).clip 输入

CLIP Text Encode (正向)
  └── CONDITIONING output  →  KSampler.positive 输入

CLIP Text Encode (反向)
  └── CONDITIONING output  →  KSampler.negative 输入

Empty Latent Image
  └── LATENT output  →  KSampler.latent_image 输入

KSampler
  └── LATENT output  →  VAE Decode.samples 输入

VAE Decode
  └── IMAGE output   →  Save Image.images 输入
"""

5. 文生图 Text-to-Image 工作流

5.1 基础文生图工作流

这是最基础也是最重要的工作流,掌握它是学习其他工作流的前提。

节点连接流程

Load Checkpoint ──┬── MODEL ──→ KSampler (model)
                  ├── CLIP ──→ CLIP Text Encode (正向) ──CONDITIONING──→ KSampler (positive)
                  ├── CLIP ──→ CLIP Text Encode (反向) ──CONDITIONING──→ KSampler (negative)
                  └── VAE ──→ VAE Decode (vae)

Empty Latent Image ──LATENT──→ KSampler (latent_image)

KSampler ──LATENT──→ VAE Decode (samples)

VAE Decode ──IMAGE──→ Save Image

5.2 各节点参数设置

Load Checkpoint:
  ckpt_name: "sd_xl_base_1.0.safetensors"  # 选择模型

CLIP Text Encode (正向提示词):
  text: "a beautiful sunset over the ocean, golden hour, 
         detailed clouds, reflections on water, 8k uhd, 
         professional photography"

CLIP Text Encode (反向提示词):
  text: "blurry, low quality, distorted, ugly, watermark, 
         text, bad anatomy, extra limbs"

Empty Latent Image:
  width: 1024     # SDXL推荐1024
  height: 1024    # SD1.5推荐512
  batch_size: 1   # 一次生成几张

KSampler:
  seed: 42              # 随机种子(-1为随机)
  steps: 30             # 采样步数(20-40)
  cfg: 7.0              # 提示词引导强度(5-12)
  sampler_name: "euler"  # 采样器
  scheduler: "normal"    # 调度器
  denoise: 1.0           # 去噪强度(文生图用1.0)

Save Image:
  filename_prefix: "ComfyUI"  # 文件名前缀

5.3 提示词编写技巧

# 正向提示词结构:
"[主体描述], [环境/场景], [风格/媒介], [质量修饰词], [技术参数]"

# 示例:
"a young woman reading a book in a cozy cafe, soft natural lighting, 
 warm color palette, bokeh background, detailed face and hands, 
 masterpiece, best quality, ultra detailed, 8k uhd"

# 反向提示词(通用模板):
"worst quality, low quality, normal quality, lowres, blurry, 
 bad anatomy, bad hands, extra fingers, missing fingers, 
 watermark, text, signature, jpeg artifacts"

# SDXL风格提示词技巧:
# 使用自然语言描述,而非标签堆砌
"A serene Japanese garden in autumn, with red maple leaves 
 reflecting in a still pond. A small wooden bridge crosses 
 the water. The scene is captured in the style of traditional 
 Japanese watercolor painting."

5.4 采样器选择指南

采样器 速度 质量 推荐场景
euler ⭐⭐⭐⭐⭐ ⭐⭐⭐ 快速预览
euler_ancestral ⭐⭐⭐⭐ ⭐⭐⭐⭐ 多样性好的结果
dpmpp_2m ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ 通用推荐
dpmpp_sde ⭐⭐⭐ ⭐⭐⭐⭐⭐ 高质量细节
dpmpp_2m_sde ⭐⭐⭐ ⭐⭐⭐⭐⭐ 细节与速度平衡
uni_pc ⭐⭐⭐⭐ ⭐⭐⭐⭐ 快速出图
ddim ⭐⭐⭐⭐ ⭐⭐⭐ 确定性结果

6. 图生图 Image-to-Image 工作流

6.1 基础图生图工作流

图生图与文生图的区别在于:不使用空白潜空间,而是将参考图像编码为潜空间后作为起点。

Load Image ──IMAGE──→ VAE Encode ──LATENT──→ KSampler
                                                    ↑
Load Checkpoint ──VAE ──────────────────→ VAE Encode

6.2 关键参数:Denoise强度

# denoise参数决定了对原图的改变程度:

denoise = 0.3  → 轻微修改,保留原图大部分内容(适合风格微调)
denoise = 0.5  → 中等修改,保留原图构图和主要元素
denoise = 0.7  → 较大修改,保留原图大致轮廓
denoise = 1.0  → 完全重绘(等于文生图,忽略原图内容)

# 推荐工作流程:
# 1. 先用 denoise=0.4 预览效果
# 2. 根据需要逐步调整到 0.5-0.7
# 3. 超过0.7基本等于重新生成了

6.3 图生图高级技巧

# 技巧1:ControlNet + 图生图(更精确的控制)
# 在图生图基础上添加ControlNet,可以同时保持原图结构并改变风格

# 技巧2:分区域图生图
# 使用Mask遮罩,只对图像的特定区域进行重绘(见第10节Inpainting)

# 技巧3:多参考图混合
"""
Load Image A ──→ VAE Encode ──→ Latent Composite
                                    ↓
Load Image B ──→ VAE Encode ──→ Latent Composite ──→ KSampler
"""

7. ControlNet 精确控制

7.1 ControlNet概述

ControlNet 是一种条件控制技术,允许你通过参考图的特定特征(边缘、姿态、深度等)精确控制生成图像的结构。它是ComfyUI中最强大的控制工具之一。

7.2 安装ControlNet预处理器

# 方法1:通过ComfyUI Manager安装(推荐)
# 在ComfyUI界面中点击 Manager 按钮 → 搜索 "comfyui_controlnet_aux" → 安装

# 方法2:手动安装
cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git
cd comfyui_controlnet_aux
pip install -r requirements.txt
# 重启ComfyUI

7.3 Canny边缘检测

# 工作流节点连接:

Load Image ──→ Canny Edge Preprocessor ──→ Apply ControlNet
                                              ↑
ControlNet Loader ──→ Apply ControlNet ──CONDITIONING──→ KSampler (positive)

# Canny Edge Preprocessor 参数:
low_threshold: 100    # 低阈值(控制细节保留)
high_threshold: 200   # 高阈值(控制边缘检测灵敏度)

# Apply ControlNet 参数:
strength: 0.8         # 控制强度(0-1,越高越严格遵循边缘)
start_percent: 0.0    # 开始应用的步数百分比
end_percent: 1.0      # 结束应用的步数百分比

# 适用场景:建筑、产品、线稿上色

7.4 OpenPose姿态控制

# 工作流节点连接:

Load Image ──→ OpenPose Preprocessor ──→ Apply ControlNet
                                            ↑
ControlNet Loader (openpose) ──→ Apply ControlNet ──→ KSampler

# OpenPose Preprocessor 参数:
detect_hand: "enable"    # 检测手部姿态
detect_body: "enable"    # 检测身体姿态
detect_face: "enable"    # 检测面部关键点

# 适用场景:人物姿态控制、舞蹈动作、运动场景

# 技巧:可以使用"Pose Editor"节点直接在ComfyUI中编辑姿态

7.5 Depth深度控制

# 工作流节点连接:

Load Image ──→ Depth Anything Preprocessor ──→ Apply ControlNet
                                                  ↑
ControlNet Loader (depth) ──→ Apply ControlNet ──→ KSampler

# 适用场景:
# - 保持图像的空间透视关系
# - 室内场景重新装饰
# - 风景照片的风格转换

# Depth Anything vs MiDaS:
# Depth Anything: 更新更准确,推荐使用
# MiDaS: 经典方案,兼容性好

7.6 多ControlNet组合

# 可以同时使用多个ControlNet进行多维度控制:

Load Image A ──→ Canny Preprocessor ──→ Apply ControlNet 1 ──→ Apply ControlNet 2
                                                                       ↑
Load Image B ──→ OpenPose Preprocessor ──→ Apply ControlNet 2 ──→ KSampler (positive)

# 组合建议:
# Canny(边缘) + Depth(深度) = 保持形状和空间关系
# OpenPose(姿态) + Depth(深度) = 保持人物姿态和空间位置
# 注意:多个ControlNet的strength总和建议不超过1.5,否则可能过度约束

8. IP-Adapter 风格迁移

8.1 IP-Adapter概述

IP-Adapter(Image Prompt Adapter)是一种以图生图的控制方式,可以将参考图像的风格、内容或角色特征迁移到生成图像中,而不需要重新训练模型。

8.2 安装与模型准备

# 1. 安装IP-Adapter自定义节点
cd ComfyUI/custom_nodes
git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git

# 2. 下载IP-Adapter模型
# 放入 ComfyUI/models/ipadapter/ 目录
# 推荐模型:
# - ip-adapter-plus_sd15.bin (SD1.5)
# - ip-adapter-plus-faceid_sd15.bin (人脸ID保持)
# - ip-adapter_sdxl.bin (SDXL)

# 3. 下载CLIP Vision模型
# 放入 ComfyUI/models/clip_vision/ 目录
# 推荐:CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors

8.3 IP-Adapter风格迁移工作流

Load Image (风格参考) ──→ IPAdapter Advanced
                              ↑
CLIP Vision Loader ──→ IPAdapter Advanced
                              ↑
IPAdapter Loader ──→ IPAdapter Advanced
                              ↓
Load Checkpoint ──MODEL──→ IPAdapter Advanced ──MODEL──→ KSampler

# IPAdapter Advanced 参数:
weight: 0.8          # 风格影响强度(0.5-1.0)
weight_type: "linear" # 权重类型
start_at: 0.0        # 开始应用步数
end_at: 1.0          # 结束应用步数

8.4 IP-Adapter高级用法

# 用法1:角色一致性(FaceID)
"""
使用 ip-adapter-plus-faceid 模型,可以保持生成图像中的人脸
与参考照片高度一致。适合生成同一角色的不同场景。

weight建议:0.7-0.9(过高可能导致面部过度拟合)
"""

# 用法2:风格+内容分离
"""
IPAdapter Batch → 可以输入多张参考图
- 使用 style_reference 图像提供风格
- 使用 content_reference 图像提供内容
通过调节各自的weight来平衡效果
"""

# 用法3:与ControlNet组合
"""
IPAdapter (风格) + ControlNet-Canny (结构)
= 保持参考图的风格,同时遵循线稿的结构

这是商业设计中最常用的组合之一
"""

9. LoRA 模型加载与融合

9.1 LoRA概述

LoRA(Low-Rank Adaptation)是一种轻量级的模型微调技术。LoRA文件通常只有几十MB到几百MB,但可以显著改变模型的生成风格或添加特定概念。

9.2 加载LoRA

# 方法1:使用LoRA Loader节点

Load Checkpoint ──MODEL,CLIP──→ Load LoRA ──MODEL,CLIP──→ KSampler/CLIP Encode
                                  ↑
                            lora_name: "my_style.safetensors"
                            strength_model: 0.8
                            strength_clip: 0.8

# 方法2:多个LoRA叠加

Load Checkpoint ──→ Load LoRA 1 ──→ Load LoRA 2 ──→ KSampler
                  (风格LoRA)     (角色LoRA)

# LoRA强度建议:
# strength_model: 影响模型生成效果,0.5-1.0
# strength_clip: 影响提示词理解,通常与model保持一致
# 多LoRA叠加时,各自的strength建议不超过0.7,总和不超过1.5

9.3 LoRA融合

# 使用LoRA Stacker节点实现多LoRA融合

# 工作流:
"""
Load Checkpoint ──MODEL,CLIP──→ LoRA Stacker ──MODEL,CLIP──→ ...
                                    ↑
LoRA Stacker输入:
  - lora_1: "style_a.safetensors", strength: 0.6
  - lora_2: "style_b.safetensors", strength: 0.4
  - lora_3: "character.safetensors", strength: 0.8
"""

# 融合策略:
# 1. 风格LoRA + 角色LoRA = 特定角色的特定风格
# 2. 多个风格LoRA混合 = 创造新的混合风格
# 3. 质量增强LoRA + 风格LoRA = 高质量的风格化输出

9.4 触发词(Trigger Words)

# 大多数LoRA需要在提示词中加入特定的触发词才能生效

# 例如:
# LoRA文件:watercolor_style.safetensors
# 触发词:watercolor painting, watercolor style
# 
# 正确用法:
# "a beautiful landscape, watercolor painting, soft colors"
#
# 查看触发词的方法:
# 1. 在Civitai的LoRA页面查看说明
# 2. 查看LoRA文件的元数据(ComfyUI中可查看)
# 3. 在LoRA Loader节点的info中查看

10. 图像修复 Inpainting

10.1 基础Inpainting工作流

Inpainting允许你只重绘图像的特定区域,保持其余部分不变。

Load Image ──→ Mask Editor (绘制遮罩)
                   ↓
Load Image ──IMAGE──→ VAE Encode (for Inpainting)
                          ↑        ↓
Load Checkpoint ──VAE──→ VAE Encode ──LATENT──→ KSampler
                                                    ↑
                   Mask ──→ KSampler (使用mask参数)

# 工作步骤:
# 1. Load Image加载原始图片
# 2. 右键Load Image节点 → "Open in Mask Editor"
# 3. 用画笔涂抹需要重绘的区域(白色=重绘区域)
# 4. 连接到VAE Encode (for Inpainting)节点
# 5. 设置KSampler的denoise(建议0.7-0.9)

10.2 Inpainting专用模型

# 使用专门的Inpainting模型效果更好

# 推荐模型:
# - sd-v1-5-inpainting.safetensors
# - stable-diffusion-xl-1.0-inpainting-0.1.safetensors

# Inpainting模型与普通模型的区别:
# Inpainting模型在训练时专门学习了如何根据遮罩填充缺失区域
# 效果更自然,边缘过渡更平滑

10.3 Outpainting(外扩绘制)

# Outpainting可以扩展图像的边界

Load Image ──→ Pad Image for Outpainting ──→ VAE Encode (for Inpainting)
                   ↑
           left/right/top/bottom: 设置各方向扩展的像素数

# 实现原理:
# 1. 在原图周围添加空白区域
# 2. 创建覆盖空白区域的mask
# 3. 使用Inpainting的方式填充扩展区域

10.4 局部重绘技巧

# 技巧1:精细mask绘制
"""
使用Mask Editor时:
- 调整画笔大小(滚轮)
- 使用橡皮擦修正
- 遮罩边缘稍微扩大几像素,确保过渡自然
"""

# 技巧2:分步重绘
"""
对于复杂场景,分多次重绘不同区域:
第1步:重绘背景(大区域,低denoise)
第2步:重绘主体(中等区域,中denoise)
第3步:修正细节(小区域,高denoise)
"""

# 技巧3:Inpaint + ControlNet
"""
使用ControlNet(如Depth或Canny)约束重绘区域的结构
防止生成的内容与周围环境不协调
"""

11. AnimateDiff 视频生成

11.1 AnimateDiff概述

AnimateDiff是一个将Stable Diffusion扩展到动画/视频生成的运动模块。它可以将静态图像生成为短视频(通常2-4秒,16帧)。

11.2 安装与模型准备

# 1. 安装AnimateDiff自定义节点
cd ComfyUI/custom_nodes
git clone https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved.git

# 2. 下载运动模块
# 放入 ComfyUI/models/animatediff/ 目录
# 推荐模型:
# - mm_sd_v15_v2.safetensors (SD1.5)
# - mm_sdxl_v10_beta.safetensors (SDXL)

# 3. 安装额外依赖
cd ComfyUI-AnimateDiff-Evolved
pip install -r requirements.txt

11.3 基础动画工作流

Load Checkpoint ──MODEL──→ AnimateDiff Loader ──MODEL──→ KSampler
                              ↑
AnimateDiff Model Loader ──→ AnimateDiff Loader
                              ↑
                    mm_sd_v15_v2.safetensors

# AnimateDiff Loader 参数:
model_name: "mm_sd_v15_v2.safetensors"
beta_schedule: "sqrt_linear (AnimateDiff)"
context_length: 16     # 每次处理的帧数
context_stride: 1      # 帧之间的步长
context_overlap: 4     # 帧之间的重叠

# Empty Latent Image 设置:
width: 512
height: 512
batch_size: 16         # 16帧 = 约2秒动画(8fps)

# KSampler 设置:
steps: 20
cfg: 7.0
sampler_name: "dpmpp_2m_sde"
scheduler: "karras"

11.4 视频保存与导出

# 使用Video Combine节点将帧序列合成为视频

VAE Decode ──IMAGE(s)──→ Video Combine
                              ↑
                    format: "video/h264-mp4"
                    fps: 8
                    filename_prefix: "animation"

# 输出格式选项:
# - video/h264-mp4: MP4格式,兼容性最好
# - image/gif: GIF格式,适合网络分享
# - video/webm: WebM格式,文件更小

11.5 高级动画技巧

# 技巧1:AnimateDiff + ControlNet
"""
使用ControlNet控制动画中每一帧的结构:
- Canny: 保持物体边缘一致
- OpenPose: 控制人物动作
- Depth: 保持空间关系

需要安装:ComfyUI-Advanced-ControlNet
"""

# 技巧2:AnimateDiff + IP-Adapter
"""
使用IP-Adapter保持动画中的角色/风格一致性
特别适合生成同一角色的连续动作序列
"""

# 技巧3:长视频生成
"""
通过调整context参数生成更长的视频:
context_length: 16 (每次16帧)
context_overlap: 4 (重叠4帧)
总帧数可以设为32、48甚至更多
但要注意显存限制
"""

12. 自定义节点开发

12.1 节点开发基础

ComfyUI的自定义节点使用Python编写。每个自定义节点是一个Python模块,定义了节点的输入、输出和处理逻辑。

12.2 最简单的自定义节点

# 文件路径: ComfyUI/custom_nodes/my_first_node/my_node.py

class SimpleTextCombine:
    """一个简单的文本合并节点"""
    
    # 节点类属性
    CATEGORY = "My Nodes"           # 在菜单中的分类
    FUNCTION = "combine"            # 调用的方法名
    RETURN_TYPES = ("STRING",)      # 返回的数据类型
    RETURN_NAMES = ("combined_text",) # 返回端口的名称
    
    @classmethod
    def INPUT_TYPES(cls):
        """定义节点的输入参数"""
        return {
            "required": {
                "text_a": ("STRING", {"multiline": True, "default": ""}),
                "text_b": ("STRING", {"multiline": True, "default": ""}),
                "separator": ("STRING", {"default": " | "}),
            },
            "optional": {
                "uppercase": ("BOOLEAN", {"default": False}),
            }
        }
    
    def combine(self, text_a, text_b, separator, uppercase=False):
        """节点的核心处理逻辑"""
        result = f"{text_a}{separator}{text_b}"
        if uppercase:
            result = result.upper()
        return (result,)

# 节点注册
NODE_CLASS_MAPPINGS = {
    "SimpleTextCombine": SimpleTextCombine
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "SimpleTextCombine": "文本合并器"
}

12.3 带图像处理的自定义节点

# 文件: ComfyUI/custom_nodes/image_utils/image_processor.py

import torch
import numpy as np
from PIL import Image, ImageFilter, ImageEnhance

class ImageStyleTransfer:
    """简易风格迁移节点:将参考图的颜色风格应用到目标图"""
    
    CATEGORY = "My Nodes/Image"
    FUNCTION = "transfer_style"
    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("styled_image",)
    
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "target_image": ("IMAGE",),
                "style_strength": ("FLOAT", {
                    "default": 0.5,
                    "min": 0.0,
                    "max": 1.0,
                    "step": 0.01,
                    "display": "slider"
                }),
            },
            "optional": {
                "reference_image": ("IMAGE",),
                "enhance_contrast": ("BOOLEAN", {"default": True}),
            }
        }
    
    def transfer_style(self, target_image, style_strength, 
                       reference_image=None, enhance_contrast=True):
        """应用风格迁移"""
        # ComfyUI中图像格式为 [batch, height, width, channels],值范围 0-1
        # 转换为PIL处理
        img_tensor = target_image[0]  # 取第一张图
        img_np = (img_tensor.cpu().numpy() * 255).astype(np.uint8)
        img_pil = Image.fromarray(img_np)
        
        # 应用风格化效果
        if reference_image is not None:
            ref_tensor = reference_image[0]
            ref_np = (ref_tensor.cpu().numpy() * 255).astype(np.uint8)
            ref_pil = Image.fromarray(ref_np)
            
            # 简化版:匹配颜色直方图
            from PIL import ImageOps
            img_pil = ImageOps.colorize(
                img_pil.convert("L"),
                black=ref_pil.getextrema()[0],
                white=ref_pil.getextrema()[1]
            )
        
        # 增强对比度
        if enhance_contrast:
            enhancer = ImageEnhance.Contrast(img_pil)
            img_pil = enhancer.enhance(1.0 + style_strength * 0.5)
        
        # 混合原图和风格化结果
        img_np = np.array(img_pil).astype(np.float32) / 255.0
        original_np = img_tensor.cpu().numpy()
        
        blended = original_np * (1 - style_strength) + img_np * style_strength
        result = torch.from_numpy(blended).unsqueeze(0)
        
        return (result,)

NODE_CLASS_MAPPINGS = {
    "ImageStyleTransfer": ImageStyleTransfer
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "ImageStyleTransfer": "图像风格迁移"
}

12.4 自定义节点的目录结构

ComfyUI/custom_nodes/
└── my_custom_nodes/
    ├── __init__.py          # 入口文件,导入节点
    ├── my_node.py           # 节点定义
    ├── utils.py             # 工具函数
    └── requirements.txt     # 依赖列表(可选)

# __init__.py 内容:
from .my_node import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS

__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]

12.5 节点开发最佳实践

# 1. 类型安全:使用ComfyUI支持的数据类型
SUPPORTED_TYPES = [
    "STRING", "INT", "FLOAT", "BOOLEAN",  # 基础类型
    "IMAGE", "LATENT", "MODEL", "CLIP",    # SD数据类型
    "CONDITIONING", "VAE", "MASK",          # SD数据类型
]

# 2. 输入验证:在处理前验证输入
def validate_inputs(self, image, strength):
    if strength < 0 or strength > 1:
        raise ValueError("strength must be between 0 and 1")
    if image.shape[-1] != 3:
        raise ValueError("image must have 3 channels (RGB)")

# 3. 错误处理:捕获并报告有意义的错误
def process(self, image):
    try:
        result = self._do_processing(image)
        return (result,)
    except Exception as e:
        print(f"[MyNode] Error: {str(e)}")
        raise

# 4. 性能优化:使用torch操作代替循环
# ❌ 慢
for i in range(height):
    for j in range(width):
        result[i, j] = some_function(image[i, j])

# ✅ 快
result = torch.where(condition, image_a, image_b)

13. 工作流导入导出与共享

13.1 保存工作流

# ComfyUI工作流的本质是一个JSON文件

# 保存方式:
# 1. 菜单 → Save → 保存为 .json 文件
# 2. Ctrl+S 快捷键
# 3. 直接拖拽画布到文件夹(会保存为.json)

# 工作流JSON结构示例(简化版):
workflow = {
    "last_node_id": 10,
    "last_link_id": 15,
    "nodes": [
        {
            "id": 1,
            "type": "Load Checkpoint",
            "pos": [100, 100],
            "size": [300, 100],
            "widgets_values": ["sd_xl_base_1.0.safetensors"]
        },
        {
            "id": 2,
            "type": "CLIPTextEncode",
            "pos": [500, 100],
            "widgets_values": ["a beautiful sunset"]
        }
    ],
    "links": [
        [1, 1, 1, 2, 1, "CLIP"]  # [link_id, from_node, from_slot, to_node, to_slot, type]
    ]
}

13.2 加载工作流

# 加载方式:
# 1. 菜单 → Load → 选择 .json 文件
# 2. Ctrl+O 快捷键
# 3. 直接将 .json 文件拖拽到ComfyUI画布
# 4. 加载包含工作流元数据的 .png 图片(ComfyUI生成的图片自带工作流信息)

# PNG图片中嵌入工作流:
# ComfyUI生成的每张图片都包含完整的工作流信息
# 直接将图片拖入ComfyUI即可还原完整工作流

13.3 工作流共享平台

# 推荐的共享平台:

platforms = {
    "Civitai": {
        "url": "https://civitai.com/",
        "特点": "最大的AI模型和工作流社区",
        "格式": "支持ComfyUI工作流直接上传和预览"
    },
    "OpenArt": {
        "url": "https://openart.ai/workflows",
        "特点": "专注ComfyUI工作流分享",
        "格式": "工作流模板市场"
    },
    "ComfyWorkflows": {
        "url": "https://comfyworkflows.com/",
        "特点": "ComfyUI专属工作流社区",
        "格式": "可在线预览和一键导入"
    },
    "GitHub": {
        "url": "各种awesome-comfyui仓库",
        "特点": "开源社区,工作流+自定义节点",
        "格式": "JSON文件,版本控制友好"
    }
}

14. 性能优化与显存管理

14.1 显存占用分析

# 不同配置的显存需求(近似值):

vram_requirements = {
    "SD 1.5 (512x512)": {
        "推理": "~3GB",
        "推荐显存": "4GB+",
    },
    "SDXL (1024x1024)": {
        "推理": "~6GB",
        "推荐显存": "8GB+",
    },
    "SDXL + ControlNet": {
        "推理": "~8GB",
        "推荐显存": "10GB+",
    },
    "SDXL + AnimateDiff (16帧)": {
        "推理": "~10GB",
        "推荐显存": "12GB+",
    },
    "Flux (1024x1024)": {
        "推理": "~12GB",
        "推荐显存": "16GB+",
    }
}

14.2 低显存优化策略

# 策略1:启动参数优化
python main.py --lowvram          # 低显存模式(6-8GB)
python main.py --novram           # 极低显存模式(4GB以下)
python main.py --cpu              # 纯CPU模式(无GPU限制)

# 策略2:环境变量优化
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512
export CUDA_VISIBLE_DEVICES=0
# 策略3:工作流内优化

# 3a. 降低分辨率
width, height = 768, 768  # 而不是1024, 1024
# 生成后使用Upscale放大

# 3b. 减少批次大小
batch_size = 1  # 每次只生成1张

# 3c. 使用VAE Tiling(大幅降低VAE解码的显存需求)
# 安装ComfyUI内置的Tiled VAE节点

# 3d. 分步处理
"""
不要一次性加载所有模型:
1. 先加载模型A → 处理 → 释放
2. 再加载模型B → 处理 → 释放
ComfyUI的 --lowvram 模式会自动处理这个逻辑
"""

# 3e. 使用模型量化
"""
对于Flux等大模型,使用FP8或NF4量化版本:
- flux1-dev-fp8.safetensors (约12GB → 约7GB)
- 显存节省约40%,质量损失很小
"""

14.3 生成速度优化

# 1. 选择合适的采样器
"""
快速采样器:
- euler: 最快,20步即可
- uni_pc: 快速且质量不错
- dpmpp_2m: 速度和质量的平衡点
"""

# 2. 合理设置采样步数
"""
SD 1.5: 20-30步
SDXL: 25-35步
Flux: 20-28步
超过40步通常没有明显提升,只会增加时间
"""

# 3. 使用TAESD(Tiny AutoEncoder for SD)
"""
TAESD是一个极小的VAE,编解码速度极快
适合预览阶段使用,正式出图时切换回完整VAE
"""

# 4. 批处理优化
"""
同时生成多张图比逐张生成更高效(利用GPU并行)
batch_size = 4  # 一次生成4张
"""

# 5. 预加载模型
"""
使用Model Preloader节点预加载模型
避免每次执行时的加载延迟
"""

14.4 ComfyUI Manager(必装管理器)

# ComfyUI Manager是最重要的辅助工具

# 安装:
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
# 重启ComfyUI

# 功能:
# 1. 一键安装/更新/卸载自定义节点
# 2. 安装缺失的模型依赖
# 3. 工作流依赖检查
# 4. 节点包管理
# 5. 版本控制和回滚

15. 常见问题排查

15.1 启动问题

# 问题1:CUDA不可用
# 错误信息:RuntimeError: CUDA is not available
# 解决方案:
nvidia-smi                    # 检查GPU是否被识别
python -c "import torch; print(torch.cuda.is_available())"  # 检查PyTorch CUDA支持
# 如果False,重新安装对应CUDA版本的PyTorch

# 问题2:端口被占用
# 错误信息:OSError: [Errno 98] Address already in use
# 解决方案:
python main.py --port 8189    # 使用其他端口

# 问题3:缺少依赖
# 错误信息:ModuleNotFoundError: No module named 'xxx'
# 解决方案:
pip install xxx               # 安装缺失的包
# 或通过ComfyUI Manager自动安装

15.2 生成问题

# 问题1:生成全黑/全绿图像
# 原因:VAE不匹配或损坏
# 解决:
# 1. 尝试更换VAE
# 2. 在Load Checkpoint中选择不同的VAE
# 3. 下载推荐的VAE模型

# 问题2:人物面部畸形
# 原因:SD1.5的固有问题,或提示词不准确
# 解决:
# 1. 使用FaceDetailer节点(需安装Impact Pack)
# 2. 使用SDXL模型(面部质量更好)
# 3. 在反向提示词中添加:"deformed face, ugly, bad anatomy"

# 问题3:图像模糊/噪点多
# 原因:采样步数不足或CFG过高
# 解决:
# 1. 增加steps到30+
# 2. 降低cfg到7左右
# 3. 尝试不同的采样器(推荐dpmpp_2m_sde)

# 问题4:显存不足(OOM)
# 错误信息:CUDA out of memory
# 解决:
# 1. 降低分辨率
# 2. 使用--lowvram启动
# 3. 减少batch_size
# 4. 关闭其他占用显存的程序
# 5. 使用FP8量化模型

15.3 自定义节点问题

# 问题1:节点安装后不显示
# 解决:
# 1. 检查custom_nodes目录下是否有对应文件夹
# 2. 重启ComfyUI
# 3. 查看启动日志是否有导入错误

# 问题2:节点报错
# 解决:
# 1. 检查是否安装了节点的requirements.txt中的依赖
# 2. 更新节点到最新版本
# 3. 查看ComfyUI控制台的错误信息

# 问题3:节点冲突
# 解决:
# 1. 逐个禁用最近安装的节点,定位冲突源
# 2. 通过ComfyUI Manager的"Fix"功能修复

16. 实战项目:完整AI绘图工作流搭建

16.1 项目概述

我们将搭建一个完整的人物肖像生成工作流,整合以下技术:

  • SDXL基础模型 + 人物LoRA
  • ControlNet姿态控制
  • IP-Adapter风格参考
  • 面部细节增强
  • 高清放大

16.2 工作流架构

┌─────────────────────────────────────────────────────────────────┐
│                    完整工作流架构图                               │
│                                                                  │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐                   │
│  │Load      │    │CLIP Text │    │CLIP Text │                   │
│  │Checkpoint│───→│Encode    │───→│Encode    │                   │
│  │(SDXL)    │    │(正向)    │    │(反向)    │                   │
│  └────┬─────┘    └────┬─────┘    └────┬─────┘                   │
│       │               │               │                          │
│       ▼               ▼               ▼                          │
│  ┌──────────┐    ┌──────────────────────┐                       │
│  │Load LoRA │───→│    Apply ControlNet   │                       │
│  │(人物风格) │    │    (OpenPose)         │                       │
│  └──────────┘    └──────────┬───────────┘                       │
│                              │                                    │
│  ┌──────────┐               ▼                                    │
│  │IP-Adapter│───→    ┌──────────┐    ┌──────────┐               │
│  │(风格参考) │    │  KSampler │───→│VAE Decode │               │
│  └──────────┘    │  (30步)   │    └────┬─────┘               │
│                   └──────────┘         │                          │
│                                        ▼                          │
│  ┌──────────┐                   ┌──────────┐    ┌──────────┐   │
│  │参考图片   │                   │FaceDetail│───→│Upscale   │   │
│  │(OpenPose)│                   │(面部增强) │    │(4x放大)  │   │
│  └──────────┘                   └──────────┘    └────┬─────┘   │
│                                                       │          │
│                                                       ▼          │
│                                                 ┌──────────┐   │
│                                                 │Save Image│   │
│                                                 └──────────┘   │
└─────────────────────────────────────────────────────────────────┘

16.3 详细搭建步骤

步骤1:加载基础模型和LoRA

# 节点1:Load Checkpoint
type: "Load Checkpoint"
参数:
  ckpt_name: "sd_xl_base_1.0.safetensors"
输出: MODEL, CLIP, VAE

# 节点2:Load LoRA
type: "Load LoRA"
输入: MODEL, CLIP(来自Checkpoint)
参数:
  lora_name: "sdxl_portrait_style.safetensors"
  strength_model: 0.7
  strength_clip: 0.7
输出: MODEL, CLIP(修改后的)

步骤2:提示词编码

# 节点3:CLIP Text Encode (正向)
type: "CLIP Text Encode"
输入: CLIP(来自LoRA)
参数:
  text: |
    a professional portrait photo of a young woman, 
    elegant pose, soft studio lighting, 
    detailed skin texture, sharp focus on eyes,
    shallow depth of field, bokeh background,
    fashion photography, magazine cover quality,
    8k uhd, masterpiece, best quality

# 节点4:CLIP Text Encode (反向)
type: "CLIP Text Encode"
输入: CLIP(来自LoRA)
参数:
  text: |
    worst quality, low quality, normal quality, 
    bad anatomy, bad hands, extra fingers, 
    missing fingers, deformed, ugly, blurry, 
    watermark, text, logo, cropped

步骤3:ControlNet姿态控制

# 节点5:Load Image (参考姿态)
type: "Load Image"
参数:
  image: "reference_pose.png"

# 节点6:OpenPose Preprocessor
type: "DW Preprocessor"(更精确的OpenPose检测器)
输入: IMAGE(来自Load Image)
参数:
  detect_hand: "enable"
  detect_body: "enable"
  detect_face: "enable"

# 节点7:ControlNet Loader
type: "ControlNet Loader"
参数:
  control_net_name: "controlnet_openpose_sdxl.safetensors"

# 节点8:Apply ControlNet
type: "Apply ControlNet"
输入:
  conditioning: CONDITIONING(来自正向CLIP Encode)
  control_net: CONTROL_NET(来自Loader)
  image: IMAGE(来自Preprocessor)
参数:
  strength: 0.75
  start_percent: 0.0
  end_percent: 0.9
输出: CONDITIONING(增强后的)

步骤4:IP-Adapter风格参考

# 节点9:Load Image (风格参考)
type: "Load Image"
参数:
  image: "style_reference.jpg"

# 节点10:CLIP Vision Loader
type: "CLIP Vision Loader"
参数:
  clip_name: "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors"

# 节点11:IPAdapter Loader
type: "IPAdapter Model Loader"
参数:
  ipadapter_file: "ip-adapter-plus_sdxl_vit-h.safetensors"

# 节点12:IPAdapter Advanced
type: "IPAdapter Advanced"
输入:
  model: MODEL(来自LoRA)
  ipadapter: IPADAPTER
  clip_vision: CLIP_VISION
  image: IMAGE(风格参考图)
参数:
  weight: 0.6
  weight_type: "linear"
  start_at: 0.0
  end_at: 0.8
输出: MODEL(风格化后的)

步骤5:采样生成

# 节点13:Empty Latent Image
type: "Empty Latent Image"
参数:
  width: 1024
  height: 1024
  batch_size: 1

# 节点14:KSampler
type: "KSampler"
输入:
  model: MODEL(来自IPAdapter)
  positive: CONDITIONING(来自ControlNet)
  negative: CONDITIONING(来自反向CLIP Encode)
  latent_image: LATENT(来自Empty Latent)
参数:
  seed: 12345
  steps: 30
  cfg: 7.0
  sampler_name: "dpmpp_2m_sde"
  scheduler: "karras"
  denoise: 1.0

# 节点15:VAE Decode
type: "VAE Decode"
输入:
  samples: LATENT(来自KSampler)
  vae: VAE(来自Checkpoint)
输出: IMAGE

步骤6:面部增强(使用Impact Pack)

# 安装Impact Pack:
# ComfyUI Manager → 搜索 "ComfyUI Impact Pack" → 安装

# 节点16:FaceDetailer
type: "FaceDetailer"
输入:
  image: IMAGE(来自VAE Decode)
  model: MODEL
  positive: CONDITIONING
  negative: CONDITIONING
  vae: VAE
参数:
  guide_size: 384
  steps: 20
  cfg: 7.0
  denoise: 0.4  # 轻微调整面部

步骤7:高清放大

# 节点17:Upscale Model Loader
type: "Upscale Model Loader"
参数:
  model_name: "RealESRGAN_x4plus.pth"

# 节点18:Upscale Image (using Model)
type: "Upscale Image (using Model)"
输入:
  upscale_model: UPSCALE_MODEL
  image: IMAGE(来自FaceDetailer)

# 节点19:Image Scale
type: "Image Scale"
输入: IMAGE(放大后的)
参数:
  upscale_method: "lanczos"
  width: 2048
  height: 2048

步骤8:保存输出

# 节点20:Save Image
type: "Save Image"
输入: IMAGE(来自Image Scale)
参数:
  filename_prefix: "portrait_final"

16.4 完整工作流JSON(可直接导入)

将以下JSON保存为 portrait_workflow.json,在ComfyUI中通过 Load 导入即可使用:

{
  "nodes": [
    {"id": 1, "type": "CheckpointLoaderSimple", "widgets_values": ["sd_xl_base_1.0.safetensors"]},
    {"id": 2, "type": "LoraLoader", "widgets_values": ["portrait_style.safetensors", 0.7, 0.7]},
    {"id": 3, "type": "CLIPTextEncode", "widgets_values": ["a professional portrait photo..."]},
    {"id": 4, "type": "CLIPTextEncode", "widgets_values": ["worst quality, low quality..."]},
    {"id": 5, "type": "LoadImage", "widgets_values": ["reference_pose.png"]},
    {"id": 6, "type": "DWPreprocessor"},
    {"id": 7, "type": "ControlNetLoader", "widgets_values": ["controlnet_openpose_sdxl.safetensors"]},
    {"id": 8, "type": "ControlNetApplyAdvanced", "widgets_values": [0.75, 0.0, 0.9]},
    {"id": 9, "type": "EmptyLatentImage", "widgets_values": [1024, 1024, 1]},
    {"id": 10, "type": "KSampler", "widgets_values": [12345, "randomize", 30, 7.0, "dpmpp_2m_sde", "karras", 1.0]},
    {"id": 11, "type": "VAEDecode"},
    {"id": 12, "type": "UpscaleModelLoader", "widgets_values": ["RealESRGAN_x4plus.pth"]},
    {"id": 13, "type": "ImageUpscaleWithModel"},
    {"id": 14, "type": "SaveImage", "widgets_values": ["portrait_final"]}
  ],
  "links": [
    [1, 1, 0, 2, 0],
    [2, 1, 1, 2, 1],
    [3, 2, 0, 10, 0],
    [4, 2, 1, 3, 0],
    [5, 2, 1, 4, 0],
    [6, 3, 0, 8, 1],
    [7, 4, 0, 10, 1],
    [8, 5, 0, 6, 0],
    [9, 6, 0, 8, 3],
    [10, 7, 0, 8, 0],
    [11, 8, 0, 10, 0],
    [12, 9, 0, 10, 2],
    [13, 10, 0, 11, 0],
    [14, 1, 2, 11, 1],
    [15, 11, 0, 13, 1],
    [16, 12, 0, 13, 0],
    [17, 13, 0, 14, 0]
  ]
}

16.5 参数调优指南

# 根据效果需求调整参数:

调优指南 = {
    "人物更像参考图": {
        "IP-Adapter weight": "提高到 0.8",
        "ControlNet strength": "提高到 0.85",
    },
    "风格更明显": {
        "LoRA strength": "提高到 0.85",
        "IP-Adapter weight": "提高到 0.7",
    },
    "更多创意自由度": {
        "ControlNet strength": "降低到 0.5",
        "IP-Adapter weight": "降低到 0.4",
        "denoise": "保持 1.0",
    },
    "更精细的细节": {
        "steps": "提高到 40",
        "FaceDetailer denoise": "提高到 0.5",
        "Upscale": "使用4x-UltraSharp",
    },
    "更快的生成速度": {
        "steps": "降低到 20",
        "sampler": "euler",
        "跳过FaceDetailer": True,
        "Upscale倍率": "2x 代替 4x",
    }
}

16.6 项目扩展方向

完成基础工作流后,可以尝试以下扩展:

  1. 批量生成:添加Repeat Latent Batch节点,一次生成多张不同种子的图片
  2. 风格切换:创建多个LoRA加载器,通过Switch节点切换不同风格
  3. 自动构图:使用Latent Composite拼接多个生成区域
  4. 质量评估:添加自定义节点,使用CLIP Score评估生成质量
  5. Web界面:使用ComfyUI的API接口,构建自定义前端
  6. 工作流自动化:结合Python脚本,实现批量处理和参数扫描

📝 总结

学习路径建议

入门 → 基础文生图 → 图生图 → ControlNet → IP-Adapter
                                              ↓
进阶 → LoRA融合 → Inpainting → AnimateDiff → 自定义节点
                                              ↓
精通 → 复杂工作流设计 → 性能优化 → API开发 → 工作流自动化

必装自定义节点清单

节点包 功能 优先级
ComfyUI Manager 节点管理 ⭐⭐⭐⭐⭐
ComfyUI Impact Pack FaceDetailer等 ⭐⭐⭐⭐⭐
ComfyUI_IPAdapter_plus IP-Adapter支持 ⭐⭐⭐⭐⭐
comfyui_controlnet_aux ControlNet预处理器 ⭐⭐⭐⭐
ComfyUI-AnimateDiff-Evolved 动画生成 ⭐⭐⭐
ComfyUI-KJNodes 实用工具集 ⭐⭐⭐
ComfyUI-Easy-Use 简化节点 ⭐⭐⭐

📚 参考资源

  • ComfyUI官方仓库:https://github.com/comfyanonymous/ComfyUI
  • ComfyUI Manager:https://github.com/ltdrdata/ComfyUI-Manager
  • Civitai模型社区:https://civitai.com/
  • ComfyUI工作流分享:https://comfyworkflows.com/
  • IP-Adapter文档:https://github.com/cubiq/ComfyUI_IPAdapter_plus

本教程最后更新:2024年 | 作者:AI教程团队

内容声明

本文内容为AI技术学习教程,仅供学习参考。如涉及技术问题,欢迎通过 xurj005@163.com 与我们交流。

目录