ComfyUI简介
ComfyUI是一款基于节点工作流的Stable Diffusion图形界面工具,专注于提供高效、灵活的AI图像生成体验。它采用模块化设计,用户可通过拖拽节点构建复杂工作流,精准控制生成流程的每个环节(如模型加载、采样器配置、图像解码等),支持Stable Diffusion、ControlNet等模型的深度定制。
相比传统SD WebUI,其显存占用减少30%-50%,能在低显存设备上处理高分辨率图像及复杂场景,同时支持工作流保存与复用,提升创作效率。该工具提供多节点并行处理、批量生成功能,并兼容WebUI的模型资源,用户可通过配置文件复用已有模型库。最新版本优化了界面布局,增加工作流管理模块和实时预览尺寸调节,支持中文插件安装。专业用户可扩展自定义节点,集成外部算法实现风格迁移、动画生成等高级应用,适用于数字艺术创作、产品设计、影视特效等多个领域。
ComfyUI vs SD WebUI对比
graph TD A[特性对比] --> B[显存占用] A --> C[操作方式] A --> D[灵活性] A --> E[学习曲线] B --> B1["ComfyUI: 减少30-50%<br/>支持8GB显卡运行SDXL"] B --> B2["WebUI: 显存占用较高<br/>需要12GB+运行SDXL"] C --> C1["ComfyUI: 节点拖拽<br/>可视化工作流"] C --> C2["WebUI: 参数表单<br/>传统UI界面"] D --> D1["ComfyUI: 完全可定制<br/>节点级控制"] D --> D2["WebUI: 预设模板<br/>有限自定义"] E --> E1["ComfyUI: 稍陡峭<br/>需理解节点关系"] E --> E2["WebUI: 较平缓<br/>直观易上手"] style B1 fill:#90EE90 style C1 fill:#90EE90 style D1 fill:#90EE90 style E2 fill:#90EE90
ComfyUI核心优势
graph LR A[ComfyUI核心优势] --> B[性能优化] A --> C[工作流管理] A --> D[扩展性] A --> E[兼容性] B --> B1["显存优化<br/>低端设备友好"] B --> B2["批量处理<br/>并行生成"] C --> C1["工作流保存<br/>一键复用"] C --> C2["版本管理<br/>历史记录"] D --> D1["自定义节点<br/>插件生态"] D --> D2["API支持<br/>自动化集成"] E --> E1["模型兼容<br/>WebUI资源通用"] E --> E2["跨平台<br/>Win/Mac/Linux"] style A fill:#FFD700 style B fill:#87CEEB style C fill:#98FB98 style D fill:#DDA0DD style E fill:#F0E68C
ComfyUI安装
ComfyUI目前安装非常简单,已经推出桌面版本。
官方资源:
- Github仓库:https://github.com/comfyanonymous/ComfyUI
- APP下载地址:https://www.comfy.org/download
- 选择对应的系统版本即可(支持Windows、macOS、Linux)
安装流程
sequenceDiagram participant U as 用户 participant W as 官网 participant D as 下载器 participant I as 安装程序 participant P as Python环境 participant C as ComfyUI U->>W: 访问www.comfy.org/download W->>U: 返回系统版本选项 U->>D: 选择并下载安装包 D->>U: 下载完成 U->>I: 运行安装程序 I->>P: 自动配置Python依赖 P->>I: 依赖安装完成 I->>C: 启动ComfyUI C->>U: 显示默认工作流界面 Note over P: 自动下载torch、PIL等依赖<br/>约需5-10分钟 Note over C: 默认加载文生图工作流
安装说明:
- 下载对应系统的安装包(约2GB)
- 双击安装包,默认安装即可
- 首次启动会联网下载Python依赖包(约1-2GB)
- 安装完成后会自动打开默认的文生图工作流
系统要求:
- Windows 10/11 或 macOS 12+ 或 Linux
- 最低8GB RAM(推荐16GB+)
- NVIDIA GPU(4GB+ VRAM)或 Apple Silicon(M系列芯片)
- 10GB+ 磁盘空间(含模型存储空间)
初识ComfyUI
安装完成后,打开ComfyUI应用,会展示一个默认的最简单文生图工作流。
默认文生图工作流架构
graph LR A[Checkpoint<br/>加载器] -->|模型| B[K采样器] A -->|CLIP| C[正向提示词] A -->|CLIP| D[负向提示词] A -->|VAE| E[VAE解码器] C -->|正条件| B D -->|负条件| B F[空Latent<br/>图像] -->|潜空间| B B -->|Latent| E E -->|像素| G[保存图像] style A fill:#FFB6C1 style B fill:#87CEEB style C fill:#90EE90 style D fill:#FFA07A style E fill:#DDA0DD style F fill:#F0E68C style G fill:#FFD700
节点说明:
- Checkpoint加载器:加载基础模型(SD 1.5/SDXL等)
- 正向提示词:描述想要生成的内容
- 负向提示词:描述不想出现的内容
- 空Latent图像:定义图像尺寸和批量数
- K采样器:核心扩散算法执行节点
- VAE解码器:将潜空间转换为可视图像
- 保存图像:输出最终结果
SD 基础模型介绍
此时新手会碰到第一个问题:如何选择SD的底模?SD的各种版本后缀又是什么意思?
SD模型版本演进
graph TD A[Stable Diffusion模型演进] --> B[SD 1.x系列] A --> C[SD 2.x系列] A --> D[SD 1.5优化版] A --> E[SDXL系列] B --> B1["SD 1.0-1.4<br/>早期版本<br/>512x512分辨率"] C --> C1["SD 2.0-2.1<br/>优化改进<br/>768x768分辨率"] D --> D1["SD 1.5<br/>最流行版本<br/>生态最完善"] E --> E1["SDXL 1.0<br/>1024x1024<br/>质量大幅提升"] E --> E2["SDXL Turbo<br/>实时生成<br/>1-4步采样"] style D1 fill:#90EE90 style E1 fill:#87CEEB style E2 fill:#FFD700
各版本详解
-
SD 1.x:Stable Diffusion的早期版本,主要用于图像生成任务。1.x表示1系列的主要版本。
-
SD 2.x:SD 1.x的后续版本,对模型进行了优化和改进,提高了图像生成质量和速度。
-
SD 1.5:最流行的版本,在SD 1.x基础上进行优化,文本到图像生成任务表现出色,社区资源最丰富。
- 分辨率:512x512(可扩展到768x768)
- 参数量:约900M
- 显存需求:最低4GB
- 生态:LoRA、ControlNet等扩展最完善
-
SDXL 1.0:在SD 1.5基础上进一步优化,采用”对抗性扩散蒸馏”(Adversarial Diffusion Distillation,简称ADD)技术。
- 分辨率:1024x1024
- 参数量:约6.6B(两阶段模型)
- 显存需求:最低8GB
- 优势:图像质量显著提升,细节更丰富
-
SDXL Turbo:SDXL 1.0的迭代版本,特点是生成效率极高。
- 生成速度:1-4步即可完成(传统需20-50步)
- 实时响应:输入提示词后立即显示图像
- 技术:对抗性扩散蒸馏,避免失真或模糊
- 局限性:
- 固定像素输出
- 细节表现(手指、面部表情)有限
- 仅供学术研究,暂未开放商业权限
模型选择决策树
graph TD Start[选择SD模型] --> Q1{显存容量?} Q1 -->|4-6GB| A1[SD 1.5系列] Q1 -->|8GB+| A2[SDXL系列] Q1 -->|12GB+| A3[SDXL + ControlNet] A1 --> Q2{应用场景?} Q2 -->|写实人像| M1[majicMIX realistic] Q2 -->|动漫二次元| M2[动漫2.5D模型] Q2 -->|快速原型| M3[基础SD 1.5] A2 --> Q3{质量 vs 速度?} Q3 -->|追求质量| M4[SDXL 1.0] Q3 -->|追求速度| M5[SDXL Turbo] A3 --> M6[SDXL + ControlNet<br/>精准控制] style Start fill:#FFD700 style M1 fill:#90EE90 style M2 fill:#87CEEB style M4 fill:#98FB98 style M5 fill:#FFA07A
微调模型推荐
知道了基础模型的版本概念之后,我们可以了解一些常见的基于SD对应版本优化的模型,以便即插即用。类似与LLM微调之后的模型,毕竟大部分人肯定不会直接使用LLM的instruct或者base版本的基础模型。
推荐模型列表
1. majicMIX realistic 麦橘写实(SD 1.5)
特点:
- 专门用于生成唯美的人像图片
- 当前版本:第七版
- 融合了多种模型,能够生成具有吸引力的面部特征
- 有效处理暗部细节
下载地址:
- ModelScope:https://modelscope.cn/models/MusePublic/majicMIX_realistic_maijuxieshi_SD_1_5
- Civitai:搜索 “majicMIX realistic”
适用场景:
- 写实人像生成
- 商业摄影风格
- 产品展示人物
- 时尚写真
2. 动漫二次元2.5D(SD 1.5)
特点:
- 比较好的动漫风SD底模
- 2.5D风格(介于2D和3D之间)
- 适合卡通风格创作
下载地址:
- ModelScope:https://modelscope.cn/models/VoidOc/ckpt_sd1.5_anime
- Civitai:搜索 “anime 2.5D”
适用场景:
- 动漫角色设计
- 游戏立绘
- 插画创作
- 表情包制作
模型对比表
| 模型名称 | 基于版本 | 风格 | 显存需求 | 适用场景 |
|---|---|---|---|---|
| majicMIX realistic | SD 1.5 | 写实人像 | 4GB+ | 商业摄影、产品展示 |
| 动漫2.5D | SD 1.5 | 动漫卡通 | 4GB+ | 插画、游戏立绘 |
| DreamShaper | SD 1.5 | 通用高质量 | 4GB+ | 多场景适用 |
| Realistic Vision | SD 1.5 | 超写实 | 4GB+ | 照片级真实感 |
| SDXL Base | SDXL 1.0 | 通用 | 8GB+ | 高分辨率通用 |
| SDXL Turbo | SDXL 1.0 | 快速生成 | 8GB+ | 实时预览、快速迭代 |
模型下载网站
模型资源平台对比
graph TD A[模型下载平台] --> B[Civitai<br/>C站] A --> C[哩布哩布AI] A --> D[吐司Tusi.Art] A --> E[HuggingFace] B --> B1["✅ 资源最全面<br/>✅ 社区最活跃<br/>❌ 需要VPN<br/>🌟 推荐指数: ⭐⭐⭐⭐⭐"] C --> C1["✅ 国内可访问<br/>✅ 界面友好<br/>✅ 适合新手<br/>🌟 推荐指数: ⭐⭐⭐⭐"] D --> D1["✅ 无需VPN<br/>✅ 在线运行<br/>✅ 一键同款<br/>🌟 推荐指数: ⭐⭐⭐⭐"] E --> E1["✅ 官方模型<br/>✅ 下载快速<br/>❌ 全英文界面<br/>🌟 推荐指数: ⭐⭐⭐"] style B fill:#FFD700 style C fill:#90EE90 style D fill:#87CEEB style E fill:#DDA0DD
1. Civitai(C站)
特点:
- SD模型下载首选平台
- 需要VPN访问
- 包含各种基础模型、LoRA模型等资源
- 每个模型下方有详细的生成参数
- 社区活跃,模型质量有保障
使用技巧:
- 使用过滤器按模型类型、风格筛选
- 查看模型评分和下载量
- 阅读模型说明了解推荐参数
- 下载前查看示例图片效果
2. 哩布哩布AI
特点:
- 国内Stable Diffusion模型分享社区
- 无需VPN,国内访问速度快
- 界面和布局类似Civitai
- 包含模型分享和图片灵感两个模块
- 非常适合新手用户
优势:
- 中文界面,学习门槛低
- 模型分类清晰(写实、动漫、风格等)
- 提供详细的使用教程
- 社区氛围友好
3. 吐司(Tusi.Art)
特点:
- 无需VPN
- AI模型分享平台
- 支持在线运行模型
- 浏览器直接使用Stable Diffusion
- 一键做同款功能
创新点:
- 无需本地部署即可体验
- 提供云端GPU资源
- 适合快速验证创意
- 支持工作流分享
4. HuggingFace
网址:https://huggingface.co/ 国内镜像:https://hf-mirror.com/
特点:
- 需要VPN(官方站点)
- 官方模型下载地址
- 下载速度快,几乎无限速
- 全英文界面
- 没有图片预览
适用场景:
- 快速下载官方模型
- API集成开发
- 研究和学习
- 模型版本管理
使用建议:
- 使用国内镜像站https://hf-mirror.com/
- 配合Git LFS下载大文件
- 阅读模型卡片(Model Card)了解细节
ComfyUI节点详解
节点类型分类
graph TD A[ComfyUI节点分类] --> B[模型加载节点] A --> C[条件控制节点] A --> D[潜空间节点] A --> E[采样节点] A --> F[编解码节点] A --> G[增强节点] A --> H[输出节点] B --> B1["Checkpoint加载器<br/>LoRA加载器<br/>VAE加载器"] C --> C1["CLIP文本编码器<br/>正向提示词<br/>负向提示词"] D --> D1["空Latent图像<br/>Latent放大<br/>Latent混合"] E --> E1["K采样器<br/>K采样器(高级)<br/>自定义采样器"] F --> F1["VAE编码器<br/>VAE解码器"] G --> G1["ControlNet<br/>IPAdapter<br/>图像处理"] H --> H1["保存图像<br/>预览图像"] style A fill:#FFD700 style B fill:#FFB6C1 style C fill:#90EE90 style D fill:#87CEEB style E fill:#DDA0DD style F fill:#F0E68C style G fill:#FFA07A style H fill:#98FB98
核心节点详解
1. Checkpoint加载器(Load Checkpoint)
功能:
- 作为工作流起点
- 加载Stable Diffusion大模型(SD 1.5/SDXL等)
- 自动解析模型的VAE和CLIP组件
- 支持自定义VAE模型加载
输出:
- MODEL:模型权重
- CLIP:文本编码器
- VAE:图像编解码器
使用技巧:
- 不同模型适合不同风格(写实、动漫、艺术等)
- 可以与LoRA加载器配合使用
- 注意显存占用(SDXL需8GB+)
2. CLIP文本编码器(CLIP Text Encode)
功能:
- 包含正向/负向提示词输入节点
- 分别连接K采样器的正负条件输入
- 实现文本条件控制
正向提示词示例:
beautiful scenery nature glass bottle landscape,
purple galaxy bottle, high quality, detailed,
masterpiece, 8k resolution
负向提示词示例:
(EasyNegative), (watermark), (signature),
(worst quality), (low quality), (bad anatomy),
NSFW, (normal quality), blurry, distorted
提示词权重控制:
(keyword)- 权重1.1倍((keyword))- 权重1.21倍(keyword:1.5)- 指定权重1.5倍[keyword]- 权重0.9倍
3. 空Latent图像(Empty Latent Image)
功能:
- 定义生成图像的尺寸和批量数量
- 输出潜空间数据至K采样器
- 文生图流程的初始参数设定节点
参数说明:
- width:图像宽度(像素)
- height:图像高度(像素)
- batch_size:一次生成的图片数量
推荐分辨率:
- SD 1.5:512x512、512x768、768x512
- SDXL:1024x1024、1024x1536、1536x1024
4. K采样器(KSampler)
功能:
- 核心生成节点
- 集成模型、提示词、潜空间数据
- 通过采样算法执行扩散过程
- 支持调节迭代步数、CFG值等关键参数
关键参数:
seed(随机种子):
fixed:固定种子,相同参数生成一致结果randomize:每次随机生成increment:种子值递增decrement:种子值递减
steps(步数):
- 降噪迭代次数
- 推荐20-30步平衡质量与效率
- 步数越多细节越精细,但边际效益递减
- SDXL Turbo仅需1-4步
CFG(Classifier-Free Guidance)值:
- 提示词引导强度
- 推荐7-9
- 过高(>12)会导致图像生硬或过曝
- 过低(<5)会导致图像偏离提示词
sampler_name(采样器):
| 采样器 | 特点 | 推荐场景 |
|---|---|---|
| dpmpp_2m | 写实风格首选 | 人像、风景 |
| euler | 快速生成基础内容 | 草图、原型 |
| euler_a | 增加随机性 | 创意探索 |
| dpmpp_sde | 高质量细节 | 精细作品 |
| lcm | 极速生成(4-8步) | 实时预览 |
| ddim | 稳定可控 | 图生图 |
scheduler(调度器):
karras:增强对比度,适合高细节需求normal:柔和过渡,减少人工感exponential:更快收敛sgm_uniform:SDXL推荐
denoise(降噪强度):
- 值域:0-1
- 默认1.0完全降噪
- 图生图推荐0.4-0.8
- 高清修复建议0.2-0.5
5. VAE解码器(VAE Decode)
功能:
- 将K采样器输出的潜空间数据转换为可视图像像素数据
- 完成图像生成过程的最终输出转换
技术原理:
- Latent空间:64x64x4(压缩表示)
- 像素空间:512x512x3(RGB图像)
- 解码比例:8倍放大
6. ControlNet应用节点
功能:
- 通过Apply ControlNet节点实现姿势控制、边缘检测等高级控制
- 需配合预处理器和模型文件使用
常用ControlNet类型:
- Canny:边缘检测,保持结构
- Depth:深度图,控制空间关系
- Pose:人体姿势控制
- Scribble:涂鸦转图像
- Line:线稿上色
7. LoRA加载器(Load LoRA)
功能:
- LoRA是底模的补丁
- 底模通常几GB,训练成本高
- LoRA只有几十MB到几百MB
- 训练和使用成本显著降低
- 保障不错的生图质量与风格
使用方式:
- 连接在Checkpoint加载器之后
- 可以叠加多个LoRA(不超过3个为宜)
- 调整strength_model和strength_clip参数控制强度
strength参数:
- 0.5-0.8:轻度风格影响
- 0.8-1.0:标准强度
- 1.0-1.5:强烈风格(可能过度)
典型应用场景
场景流程对比
graph TD A[典型应用场景] --> B[文生图] A --> C[图生图] A --> D[局部修复] A --> E[高清放大] B --> B1["Checkpoint → CLIP →<br/>空Latent → K采样器 →<br/>VAE解码 → 保存"] C --> C1["加载图像 → VAE编码 →<br/>K采样器 → VAE解码 →<br/>保存"] D --> D1["图像加载 → 遮罩编辑 →<br/>Latent噪波遮罩 →<br/>K采样器 → 保存"] E --> E1["加载图像 → Latent放大 →<br/>K采样器(低denoise) →<br/>VAE解码 → 保存"] style B1 fill:#90EE90 style C1 fill:#87CEEB style D1 fill:#FFD700 style E1 fill:#DDA0DD
1. 文生图(Text to Image)
流程:Checkpoint → CLIP → 空Latent → K采样器 → VAE解码 → 保存
适用场景:
- 从零创作图像
- 探索创意概念
- 批量生成素材
2. 图生图(Image to Image)
流程:加载图像 → VAE编码 → K采样器 → VAE解码
适用场景:
- 风格转换
- 细节优化
- 图像变体生成
3. 局部修复(Inpainting)
流程:图像加载 → 遮罩编辑 → Latent噪波遮罩 → K采样器
适用场景:
- 移除不需要的物体
- 修复图像瑕疵
- 局部内容替换
4. 高清放大(Upscaling)
流程:加载图像 → Latent放大 → K采样器(低denoise) → VAE解码
适用场景:
- 提升图像分辨率
- 增强图像细节
- 准备打印素材
实战示例
文生图实战
1. 模型准备
将下载好的模型文件放到对应目录:
macOS路径:
/Users/用户名/Documents/ComfyUI/models/checkpoints/
Windows路径:
C:\Users\用户名\Documents\ComfyUI\models\checkpoints\
Linux路径:
~/ComfyUI/models/checkpoints/
2. 选择底模
在Checkpoint加载器中选择majicmixRealistic_v7.safetensors
3. 编写提示词
正向提示词:
beautiful scenery nature glass bottle landscape,
purple galaxy bottle, sparkling stars inside bottle,
magical atmosphere, highly detailed, sharp focus,
professional photography, 8k uhd, masterpiece
负向提示词:
(EasyNegative), (watermark), (signature),
(sketch by bad-artist), (worst quality),
(low quality), (bad anatomy), NSFW,
(normal quality), blurry, distorted,
duplicate, ugly, deformed
4. 配置Latent图像
- 宽度(width):512
- 高度(height):768
- 批次大小(batch_size):1
5. K采样器参数
- seed:randomize(随机)
- steps:25
- cfg:7.5
- sampler_name:dpmpp_2m
- scheduler:karras
- denoise:1.0
6. 执行生成
点击”Queue Prompt”按钮(或右上角的执行按钮),等待图像生成完成。
生成的图片位置:
/Users/用户名/Documents/ComfyUI/output/
也可以在ComfyUI界面右侧的”历史记录”中查看。
文生图完整流程序列图
sequenceDiagram participant U as 用户 participant C as Checkpoint加载器 participant CL as CLIP编码器 participant L as 空Latent participant K as K采样器 participant V as VAE解码器 participant S as 保存图像 U->>C: 选择majicMIX模型 C->>C: 加载模型权重 C-->>CL: 传递CLIP C-->>V: 传递VAE C-->>K: 传递MODEL U->>CL: 输入正向提示词 U->>CL: 输入负向提示词 CL->>CL: 文本编码 CL-->>K: 传递条件向量 U->>L: 设置512x768分辨率 L->>L: 生成随机噪声 L-->>K: 传递Latent U->>K: 配置采样参数<br/>(steps=25, cfg=7.5) K->>K: 执行扩散采样<br/>(25次迭代) K-->>V: 传递生成的Latent V->>V: Latent→像素转换 V-->>S: 传递像素数据 S->>S: 保存为PNG文件 S-->>U: 显示生成结果 Note over K: 扩散过程:<br/>噪声→图像<br/>耗时5-30秒
图生图实战
1. 加载工作流模板
点击菜单”工作流 → 浏览模板”,选择”图像到图像”(Image to Image)的工作流模板。
2. 工作流差异
图生图工作流与文生图的唯一区别:
- 文生图:空Latent图像节点
- 图生图:加载图像 + VAE编码节点
graph LR A[图生图 vs 文生图] --> B[文生图路径] A --> C[图生图路径] B --> B1[空Latent图像] --> B2[随机噪声] C --> C1[加载图像] --> C2[VAE编码] --> C3[图像Latent] B2 --> D[K采样器] C3 --> D style C fill:#87CEEB style B fill:#90EE90
3. 上传参考图像
在”加载图像”节点中,点击”Choose File”上传一张参考图片(例如:动漫角色图)。
4. 修改提示词
1 girl, blue hair, beautiful eyes,
detailed face, high quality, anime style
5. 调整denoise参数
denoise参数说明:
- 0.0:完全保留原图,无变化
- 0.3-0.5:轻微调整,保持原图80%以上相似度
- 0.6-0.8:明显变化,改变风格或细节
- 1.0:完全重绘,仅参考大致结构
本次设置:denoise = 0.5(保持原图结构,修改头发颜色)
6. 执行生成
生成的图片与原始图片保持80%以上的相似度,主要改变是女孩的头发颜色从黑色变为蓝色。
LoRA使用实战
1. 下载LoRA模型
推荐LoRA:
- 哩布哩布AI:https://www.liblib.art/modelinfo/4c5eb179d4705198d866e22ca0833ef3
- Civitai:搜索对应风格的LoRA
2. 放置LoRA文件
将下载的.safetensors文件放到:
/Users/用户名/Documents/ComfyUI/models/loras/
3. 添加LoRA节点
在Checkpoint加载器之后,添加”Load LoRA”节点:
- 右键空白处 → Add Node → loaders → Load LoRA
4. 连接节点
graph LR A[Checkpoint<br/>加载器] -->|MODEL| B[Load LoRA] A -->|CLIP| B B -->|MODEL| C[K采样器] B -->|CLIP| D[CLIP文本编码] style B fill:#FFD700
5. 配置LoRA参数
- lora_name:选择下载的LoRA模型
- strength_model:0.8(模型强度)
- strength_clip:0.8(提示词强度)
6. 调整提示词
在提示词中加入LoRA激活词(通常在LoRA模型说明中):
<lora_trigger_word>, beautiful girl,
detailed face, high quality, masterpiece
7. 执行生成
生成的图片会带有LoRA定义的特殊风格(例如:特定画风、特定角色风格)。
LoRA使用流程图
graph TD Start[开始使用LoRA] --> A[下载LoRA模型] A --> B[放置到loras目录] B --> C[在ComfyUI中添加Load LoRA节点] C --> D[连接Checkpoint和K采样器] D --> E[选择LoRA文件] E --> F[设置strength参数] F --> G[在提示词中添加触发词] G --> H[执行生成] H --> I{效果满意?} I -->|否| J[调整strength<br/>或更换LoRA] J --> F I -->|是| K[保存工作流<br/>继续创作] style Start fill:#FFD700 style K fill:#90EE90
ComfyUI API使用
虽然ComfyUI主要是GUI工具,但它提供了强大的HTTP API接口,支持通过编程方式控制工作流。
API基础示例
import json
import requests
import websocket
import uuid
class ComfyUIClient:
"""ComfyUI API客户端"""
def __init__(self, server_address="127.0.0.1:8188"):
"""
初始化客户端
Args:
server_address: ComfyUI服务器地址,格式为 "IP:端口"
"""
self.server_address = server_address
self.client_id = str(uuid.uuid4())
def queue_prompt(self, prompt):
"""
提交工作流到队列
Args:
prompt: 工作流JSON配置
Returns:
dict: 包含prompt_id的响应
"""
p = {"prompt": prompt, "client_id": self.client_id}
data = json.dumps(p).encode('utf-8')
# 提交到/prompt端点
req = requests.post(
f"http://{self.server_address}/prompt",
data=data,
headers={'Content-Type': 'application/json'}
)
return json.loads(req.text)
def get_image(self, filename, subfolder, folder_type):
"""
下载生成的图片
Args:
filename: 文件名
subfolder: 子文件夹
folder_type: 文件夹类型(output/input/temp)
Returns:
bytes: 图片数据
"""
data = {
"filename": filename,
"subfolder": subfolder,
"type": folder_type
}
url_values = requests.utils.quote(json.dumps(data))
response = requests.get(
f"http://{self.server_address}/view?{url_values}"
)
return response.content
def get_history(self, prompt_id):
"""
获取执行历史
Args:
prompt_id: 提示词ID
Returns:
dict: 历史记录数据
"""
response = requests.get(
f"http://{self.server_address}/history/{prompt_id}"
)
return json.loads(response.text)
# 使用示例
if __name__ == "__main__":
# 创建客户端
client = ComfyUIClient("127.0.0.1:8188")
# 定义工作流(这里使用简化的示例)
# 实际使用时,需要从ComfyUI导出完整的工作流JSON
workflow = {
"3": { # Checkpoint加载器
"inputs": {
"ckpt_name": "majicmixRealistic_v7.safetensors"
},
"class_type": "CheckpointLoaderSimple"
},
"6": { # 正向提示词
"inputs": {
"text": "beautiful landscape, masterpiece",
"clip": ["3", 1]
},
"class_type": "CLIPTextEncode"
},
# ... 更多节点配置
}
# 提交工作流
response = client.queue_prompt(workflow)
prompt_id = response['prompt_id']
print(f"任务已提交,ID: {prompt_id}")
# 等待完成并获取结果
# 实际应用中需要使用WebSocket监听进度
import time
time.sleep(30) # 简化示例,实际应监听WebSocket
history = client.get_history(prompt_id)
print("任务完成!")批量生成图像脚本
import os
import time
from comfyui_client import ComfyUIClient
class BatchImageGenerator:
"""批量图像生成器"""
def __init__(self, server="127.0.0.1:8188"):
"""
初始化生成器
Args:
server: ComfyUI服务器地址
"""
self.client = ComfyUIClient(server)
def load_workflow_template(self, template_path):
"""
加载工作流模板
Args:
template_path: 模板JSON文件路径
Returns:
dict: 工作流配置
"""
with open(template_path, 'r', encoding='utf-8') as f:
return json.load(f)
def modify_prompt(self, workflow, positive_prompt, negative_prompt=None):
"""
修改工作流中的提示词
Args:
workflow: 工作流配置
positive_prompt: 正向提示词
negative_prompt: 负向提示词(可选)
Returns:
dict: 修改后的工作流
"""
# 找到CLIP文本编码节点(节点ID可能不同,需根据实际工作流调整)
for node_id, node_data in workflow.items():
if node_data.get("class_type") == "CLIPTextEncode":
if "positive" in node_data.get("_meta", {}).get("title", "").lower():
node_data["inputs"]["text"] = positive_prompt
elif negative_prompt and "negative" in node_data.get("_meta", {}).get("title", "").lower():
node_data["inputs"]["text"] = negative_prompt
return workflow
def modify_seed(self, workflow, seed):
"""
修改工作流中的随机种子
Args:
workflow: 工作流配置
seed: 随机种子值
Returns:
dict: 修改后的工作流
"""
for node_id, node_data in workflow.items():
if node_data.get("class_type") == "KSampler":
node_data["inputs"]["seed"] = seed
return workflow
def generate_batch(self, template_path, prompts_list, output_dir):
"""
批量生成图像
Args:
template_path: 工作流模板路径
prompts_list: 提示词列表 [(positive, negative), ...]
output_dir: 输出目录
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 加载模板
base_workflow = self.load_workflow_template(template_path)
for idx, (pos_prompt, neg_prompt) in enumerate(prompts_list):
print(f"\n[{idx+1}/{len(prompts_list)}] 生成图像...")
print(f"正向提示词: {pos_prompt}")
# 复制工作流并修改参数
workflow = base_workflow.copy()
workflow = self.modify_prompt(workflow, pos_prompt, neg_prompt)
workflow = self.modify_seed(workflow, idx * 1000) # 不同的seed
# 提交任务
response = self.client.queue_prompt(workflow)
prompt_id = response['prompt_id']
# 等待完成(简化示例,实际应使用WebSocket)
time.sleep(30)
# 获取结果
history = self.client.get_history(prompt_id)
# 下载图片
# 实际实现需要解析history获取输出文件信息
print(f"图像 {idx+1} 生成完成!")
# 使用示例
if __name__ == "__main__":
generator = BatchImageGenerator()
# 定义批量提示词
prompts = [
("beautiful sunset over ocean, masterpiece", "bad quality, blurry"),
("mountain landscape with snow, highly detailed", "ugly, distorted"),
("cyberpunk city at night, neon lights", "low quality, watermark"),
]
# 批量生成
generator.generate_batch(
template_path="workflow_template.json",
prompts_list=prompts,
output_dir="./batch_output"
)自定义节点开发示例
ComfyUI支持通过Python开发自定义节点,扩展功能。
class ImageWatermark:
"""图像水印添加节点"""
@classmethod
def INPUT_TYPES(cls):
"""
定义节点输入类型
Returns:
dict: 输入参数配置
"""
return {
"required": {
"image": ("IMAGE",), # 输入图像
"text": ("STRING", { # 水印文字
"default": "ComfyUI Generated",
"multiline": False
}),
"position": (["top-left", "top-right", "bottom-left", "bottom-right"],),
"opacity": ("FLOAT", {
"default": 0.5,
"min": 0.0,
"max": 1.0,
"step": 0.1
}),
}
}
RETURN_TYPES = ("IMAGE",)
FUNCTION = "add_watermark"
CATEGORY = "image/postprocessing"
def add_watermark(self, image, text, position, opacity):
"""
添加水印到图像
Args:
image: 输入图像张量
text: 水印文字
position: 位置
opacity: 不透明度
Returns:
tuple: (处理后的图像,)
"""
from PIL import Image, ImageDraw, ImageFont
import torch
import numpy as np
# 将torch张量转换为PIL图像
# image shape: [batch, height, width, channels]
batch_size = image.shape[0]
output_images = []
for i in range(batch_size):
# 转换为numpy数组
img_array = (image[i].cpu().numpy() * 255).astype(np.uint8)
pil_image = Image.fromarray(img_array)
# 创建水印层
watermark = Image.new('RGBA', pil_image.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(watermark)
# 尝试加载字体(如果失败则使用默认字体)
try:
font = ImageFont.truetype("arial.ttf", 20)
except:
font = ImageFont.load_default()
# 计算文字位置
text_bbox = draw.textbbox((0, 0), text, font=font)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
margin = 10
if position == "top-left":
text_position = (margin, margin)
elif position == "top-right":
text_position = (pil_image.width - text_width - margin, margin)
elif position == "bottom-left":
text_position = (margin, pil_image.height - text_height - margin)
else: # bottom-right
text_position = (pil_image.width - text_width - margin,
pil_image.height - text_height - margin)
# 绘制水印(白色文字,带透明度)
alpha = int(255 * opacity)
draw.text(text_position, text, fill=(255, 255, 255, alpha), font=font)
# 合并图像
pil_image = pil_image.convert('RGBA')
watermarked = Image.alpha_composite(pil_image, watermark)
watermarked = watermarked.convert('RGB')
# 转换回torch张量
img_array = np.array(watermarked).astype(np.float32) / 255.0
output_images.append(torch.from_numpy(img_array))
# 重新组合batch
output = torch.stack(output_images)
return (output,)
# 注册节点
NODE_CLASS_MAPPINGS = {
"ImageWatermark": ImageWatermark
}
NODE_DISPLAY_NAME_MAPPINGS = {
"ImageWatermark": "Add Watermark"
}自定义节点安装步骤:
- 在
ComfyUI/custom_nodes/目录下创建新文件夹(如my_nodes) - 在该文件夹中创建
__init__.py和节点脚本 - 重启ComfyUI,新节点会自动加载
工作流JSON配置示例
ComfyUI的工作流可以导出为JSON格式,便于分享和版本控制。
{
"1": {
"inputs": {
"ckpt_name": "majicmixRealistic_v7.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"2": {
"inputs": {
"text": "beautiful scenery nature glass bottle landscape, purple galaxy bottle",
"clip": ["1", 1]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Positive)"
}
},
"3": {
"inputs": {
"text": "(EasyNegative), (watermark), (signature), (worst quality), (low quality)",
"clip": ["1", 1]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Negative)"
}
},
"4": {
"inputs": {
"width": 512,
"height": 768,
"batch_size": 1
},
"class_type": "EmptyLatentImage",
"_meta": {
"title": "Empty Latent Image"
}
},
"5": {
"inputs": {
"seed": 42,
"steps": 25,
"cfg": 7.5,
"sampler_name": "dpmpp_2m",
"scheduler": "karras",
"denoise": 1.0,
"model": ["1", 0],
"positive": ["2", 0],
"negative": ["3", 0],
"latent_image": ["4", 0]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"6": {
"inputs": {
"samples": ["5", 0],
"vae": ["1", 2]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"7": {
"inputs": {
"filename_prefix": "ComfyUI",
"images": ["6", 0]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
}
}工作流JSON说明:
- 每个节点用数字ID标识
inputs定义节点输入参数- 数组形式
["节点ID", 输出索引]表示节点间的连接 class_type指定节点类型_meta包含元数据(如标题)
常见问题解答(Q&A)
Q1:如何选择合适的SD基础模型?
A:根据显存和应用场景选择
决策流程:
graph TD Start[选择模型] --> Q1{显存容量?} Q1 -->|4-6GB| A1[SD 1.5系列] Q1 -->|8-10GB| A2[SDXL 1.0] Q1 -->|12GB+| A3[SDXL + 增强功能] A1 --> Q2{应用场景?} Q2 -->|写实人像| M1["推荐:majicMIX realistic<br/>特点:面部细节好"] Q2 -->|动漫风格| M2["推荐:动漫2.5D<br/>特点:二次元风格"] Q2 -->|通用创作| M3["推荐:DreamShaper<br/>特点:质量稳定"] A2 --> Q3{速度 vs 质量?} Q3 -->|追求质量| M4["SDXL 1.0<br/>20-30步采样"] Q3 -->|追求速度| M5["SDXL Turbo<br/>1-4步采样"] A3 --> M6["SDXL + ControlNet<br/>+ 多个LoRA"] style Start fill:#FFD700 style M1 fill:#90EE90 style M2 fill:#87CEEB style M4 fill:#98FB98
对比表:
| 模型版本 | 显存需求 | 分辨率 | 生成速度 | 质量 | 适合人群 |
|---|---|---|---|---|---|
| SD 1.5 | 4GB+ | 512x512 | 快 | 良好 | 新手、低配置 |
| SDXL 1.0 | 8GB+ | 1024x1024 | 中等 | 优秀 | 进阶用户 |
| SDXL Turbo | 8GB+ | 1024x1024 | 极快 | 良好 | 快速迭代 |
最佳实践:
- 新手建议从SD 1.5开始学习
- 显存8GB+可直接使用SDXL
- 不同场景准备多个模型
- 结合LoRA扩展风格
Q2:显存不足时如何优化?
A:采用多种显存优化技术
优化方案对比:
graph TD A[显存优化方案] --> B[模型优化] A --> C[参数优化] A --> D[硬件优化] B --> B1["✅ 使用SD 1.5替代SDXL<br/>显存需求: 8GB→4GB"] B --> B2["✅ 启用VAE Tiling<br/>减少30%显存"] B --> B3["✅ 使用Attention Slicing<br/>减少40%显存"] C --> C1["✅ 降低分辨率<br/>512x512→ 4GB<br/>768x768→ 6GB"] C --> C2["✅ 减少batch_size<br/>4→1可节省75%"] C --> C3["✅ 降低采样步数<br/>30步→20步节省33%"] D --> D1["✅ 关闭其他程序<br/>释放系统显存"] D --> D2["✅ 使用--lowvram参数<br/>CPU辅助处理"] style A fill:#FFD700 style B1 fill:#90EE90 style B2 fill:#87CEEB style C1 fill:#98FB98
具体操作:
-
启用VAE Tiling(节省30%显存)
- 在ComfyUI设置中启用
- 或添加”VAE Encode/Decode Tiling”节点
-
使用Attention Slicing(节省40%显存)
- 启动ComfyUI时添加参数:
--use-split-cross-attention - macOS/Linux:
./ComfyUI --use-split-cross-attention - Windows:
ComfyUI.exe --use-split-cross-attention
- 启动ComfyUI时添加参数:
-
调整分辨率和批次
显存4GB:512x512, batch_size=1 显存6GB:768x768, batch_size=1 显存8GB:1024x1024, batch_size=1 显存12GB:1024x1024, batch_size=4 -
分步生成高分辨率图像
- 先生成512x512
- 再使用Latent Upscale放大
- 最后用低denoise值(0.3-0.5)细化
显存占用估算:
基础模型加载: 2-4GB (SD 1.5) 或 6-8GB (SDXL)
图像生成: 分辨率² × batch_size × 0.001GB
VAE解码: 分辨率² × 0.002GB
LoRA加载: 每个约100-300MB
Q3:如何编写高质量提示词?
A:遵循结构化提示词编写原则
提示词结构:
graph LR A[高质量提示词] --> B[主体描述] A --> C[细节补充] A --> D[风格定义] A --> E[质量标签] B --> B1["人物/物体/场景<br/>例:beautiful girl"] C --> C1["特征描述<br/>例:blue eyes, long hair"] C --> C2["动作姿态<br/>例:sitting, smiling"] C --> C3["服装配饰<br/>例:white dress"] D --> D1["艺术风格<br/>例:anime style"] D --> D2["光影效果<br/>例:soft lighting"] D --> D3["色彩基调<br/>例:warm colors"] E --> E1["质量词<br/>masterpiece, 8k"] E --> E2["细节词<br/>highly detailed"] style A fill:#FFD700 style B fill:#FFB6C1 style C fill:#90EE90 style D fill:#87CEEB style E fill:#98FB98
提示词模板:
[主体] + [细节] + [环境] + [风格] + [质量标签]
示例1 - 人像摄影:
正向提示词:
portrait of a beautiful woman,
blue eyes, long blonde hair,
wearing white dress,
standing in garden with flowers,
soft natural lighting,
professional photography,
masterpiece, best quality,
highly detailed, 8k uhd, sharp focus
负向提示词:
(worst quality), (low quality),
(normal quality), lowres,
bad anatomy, bad hands,
text, error, missing fingers,
extra digit, fewer digits,
cropped, worst quality,
jpeg artifacts, signature,
watermark, username, blurry
示例2 - 场景画面:
正向提示词:
beautiful scenery nature glass bottle landscape,
purple galaxy bottle,
sparkling stars inside bottle,
on wooden table,
magical atmosphere,
cinematic lighting,
highly detailed,
masterpiece, 8k resolution
负向提示词:
(EasyNegative), ugly, blurry,
low quality, distorted,
bad composition, overexposed
提示词技巧:
-
权重控制
(keyword) # 权重1.1倍 ((keyword)) # 权重1.21倍 (keyword:1.5) # 指定权重1.5倍 [keyword] # 权重0.9倍 -
词序优先级
- 越前面的词权重越高
- 核心描述放在最前
- 质量标签放在最后
-
组合使用
(masterpiece:1.2), (best quality:1.1), highly detailed -
使用专业术语
- 摄影:bokeh, depth of field, golden hour
- 艺术:oil painting, watercolor, impressionism
- 光影:rim lighting, volumetric lighting, subsurface scattering
常用质量标签:
正向:
masterpiece, best quality, high quality,
highly detailed, extremely detailed,
sharp focus, 8k uhd, professional,
photorealistic, realistic
负向:
worst quality, low quality, normal quality,
lowres, blurry, fuzzy, out of focus,
bad anatomy, bad proportions, distorted,
ugly, duplicate, watermark, signature
Q4:节点连接错误如何排查?
A:系统化排查连接问题
排查流程:
graph TD Start[节点连接错误] --> Q1{错误类型?} Q1 -->|数据类型不匹配| A1[检查输入输出类型] Q1 -->|必需输入缺失| A2[检查所有必需连接] Q1 -->|循环依赖| A3[检查节点顺序] A1 --> S1["查看节点说明<br/>确认数据类型<br/>IMAGE/LATENT/CLIP等"] A2 --> S2["查看红色标记<br/>连接所有必需输入<br/>参考模板工作流"] A3 --> S3["检查数据流向<br/>确保单向流动<br/>无回环连接"] S1 --> Fix1["转换数据类型<br/>或更换节点"] S2 --> Fix2["添加缺失节点<br/>完成连接"] S3 --> Fix3["重新组织节点<br/>理清依赖关系"] Fix1 --> End[问题解决] Fix2 --> End Fix3 --> End style Start fill:#FF6B6B style End fill:#90EE90
常见错误类型:
-
数据类型不匹配
错误示例: VAE Decode节点的samples输入连接到了IMAGE输出 解决方案: VAE Decode需要LATENT类型输入 应连接K采样器的LATENT输出 -
必需输入缺失
错误示例: K采样器的positive或negative输入未连接 解决方案: 添加CLIP Text Encode节点 连接正向和负向提示词 -
输出索引错误
错误示例: Checkpoint加载器有3个输出[MODEL, CLIP, VAE] 连接["1", 3]会报错(索引从0开始) 解决方案: 使用正确索引: ["1", 0] → MODEL ["1", 1] → CLIP ["1", 2] → VAE
数据类型速查表:
| 数据类型 | 说明 | 常见来源节点 | 常见目标节点 |
|---|---|---|---|
| MODEL | 模型权重 | Checkpoint加载器 | K采样器 |
| CLIP | 文本编码器 | Checkpoint加载器 | CLIP文本编码 |
| VAE | 图像编解码器 | Checkpoint加载器 | VAE编码/解码 |
| CONDITIONING | 条件向量 | CLIP文本编码 | K采样器 |
| LATENT | 潜空间数据 | 空Latent/VAE编码 | K采样器/VAE解码 |
| IMAGE | 像素图像 | VAE解码/加载图像 | 保存图像 |
调试技巧:
-
使用预览节点
- 在关键位置添加”Preview Image”节点
- 检查中间结果是否正确
-
对比模板工作流
- 使用官方模板作为参考
- 逐个节点对比连接
-
简化工作流
- 从最简单的文生图开始
- 逐步添加复杂节点
-
查看控制台日志
- ComfyUI控制台会显示详细错误信息
- 记录错误消息搜索解决方案
Q5:如何提升图像生成质量?
A:从多个维度优化生成质量
质量优化策略:
graph TD A[提升图像质量] --> B[模型选择] A --> C[提示词优化] A --> D[采样参数调优] A --> E[后处理增强] B --> B1["✅ 使用高质量基础模型<br/>majicMIX/DreamShaper"] B --> B2["✅ 叠加风格LoRA<br/>1-2个为宜"] C --> C1["✅ 详细描述<br/>20-50个词"] C --> C2["✅ 添加质量标签<br/>masterpiece, 8k"] C --> C3["✅ 完善负向提示词<br/>排除低质量元素"] D --> D1["✅ 增加采样步数<br/>25-35步"] D --> D2["✅ 调整CFG值<br/>7-9为最佳"] D --> D3["✅ 选择合适采样器<br/>dpmpp_2m/dpmpp_sde"] E --> E1["✅ 高清修复<br/>Latent Upscale"] E --> E2["✅ 面部修复<br/>CodeFormer/GFPGAN"] E --> E3["✅ 细节增强<br/>提高分辨率"] style A fill:#FFD700 style B fill:#FFB6C1 style C fill:#90EE90 style D fill:#87CEEB style E fill:#DDA0DD
参数推荐配置:
写实风格:
模型:majicMIX realistic v7
采样器:dpmpp_2m
调度器:karras
步数:28
CFG:7.5
分辨率:512x768 或 768x512
denoise:1.0
LoRA:写实增强LoRA (strength 0.6-0.8)
动漫风格:
模型:动漫2.5D / Anything v5
采样器:euler_a
调度器:normal
步数:25
CFG:8.0
分辨率:512x768
denoise:1.0
LoRA:画风LoRA (strength 0.7-0.9)
艺术风格:
模型:DreamShaper / Protogen
采样器:dpmpp_sde
调度器:karras
步数:30
CFG:9.0
分辨率:768x768
denoise:1.0
LoRA:艺术风格LoRA (strength 0.8-1.0)
高清修复工作流:
sequenceDiagram participant A as 第一阶段 participant B as Latent Upscale participant C as 第二阶段 participant D as 输出 A->>A: 生成512x512基础图 Note over A: steps=25, denoise=1.0 A->>B: 传递Latent B->>B: 放大到1024x1024 B->>C: 传递放大后的Latent C->>C: 细化处理 Note over C: steps=20, denoise=0.4 C->>D: 输出高清图像
最佳实践:
-
分辨率选择
- SD 1.5:512、768、896(64的倍数)
- SDXL:1024、1152、1280、1536
- 避免奇数分辨率
-
CFG值调优
- 太低(<5):图像偏离提示词
- 适中(7-9):最佳平衡
- 太高(>12):过度饱和,颜色失真
-
采样步数
- 20步:快速预览
- 25-30步:标准质量
- 35-50步:极致细节(收益递减)
-
多次生成选择
- batch_size=4,生成多张
- 选择最佳结果
- 使用相同seed微调
Q6:工作流如何保存和复用?
A:使用ComfyUI的工作流管理功能
工作流管理流程:
graph LR A[创建工作流] --> B[测试验证] B --> C[保存工作流] C --> D[分类管理] D --> E[复用调整] E --> F[版本控制] C --> C1["点击Save<br/>导出JSON文件"] D --> D1["创建文件夹<br/>文生图/图生图/修复等"] E --> E1["Load工作流<br/>修改参数<br/>另存为新版本"] F --> F1["Git管理<br/>或云盘同步"] style A fill:#FFD700 style C fill:#90EE90 style D fill:#87CEEB style E fill:#98FB98
保存工作流:
-
方法1:通过菜单保存
- 点击右上角”Save”按钮
- 输入工作流名称
- 选择保存位置
-
方法2:导出JSON
- 点击”Export”或”Download”
- 保存为
.json文件 - 可用于分享或版本控制
-
方法3:保存到图像
- 生成的图片会嵌入工作流信息
- 将图片拖回ComfyUI即可加载工作流
加载工作流:
-
从菜单加载
工作流 → 浏览模板 → 选择已保存的工作流 -
从文件加载
工作流 → Load → 选择.json文件 -
从图片加载
直接将包含工作流的图片拖入ComfyUI界面
工作流组织建议:
workflows/
├── text-to-image/
│ ├── realistic-portrait.json
│ ├── anime-character.json
│ └── landscape.json
├── image-to-image/
│ ├── style-transfer.json
│ └── color-correction.json
├── inpainting/
│ ├── remove-object.json
│ └── face-swap.json
└── upscaling/
├── 2x-upscale.json
└── 4x-upscale.json
工作流模板化:
# 创建工作流模板管理器
import json
import os
class WorkflowTemplateManager:
"""工作流模板管理器"""
def __init__(self, templates_dir="./workflow_templates"):
"""
初始化模板管理器
Args:
templates_dir: 模板存储目录
"""
self.templates_dir = templates_dir
os.makedirs(templates_dir, exist_ok=True)
def save_template(self, workflow, name, category="general"):
"""
保存工作流模板
Args:
workflow: 工作流JSON数据
name: 模板名称
category: 分类(text2img/img2img等)
"""
category_dir = os.path.join(self.templates_dir, category)
os.makedirs(category_dir, exist_ok=True)
filepath = os.path.join(category_dir, f"{name}.json")
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(workflow, f, indent=2, ensure_ascii=False)
print(f"✅ 模板已保存: {filepath}")
def load_template(self, name, category="general"):
"""
加载工作流模板
Args:
name: 模板名称
category: 分类
Returns:
dict: 工作流JSON数据
"""
filepath = os.path.join(self.templates_dir, category, f"{name}.json")
if not os.path.exists(filepath):
raise FileNotFoundError(f"模板不存在: {filepath}")
with open(filepath, 'r', encoding='utf-8') as f:
workflow = json.load(f)
print(f"✅ 模板已加载: {filepath}")
return workflow
def list_templates(self, category=None):
"""
列出所有模板
Args:
category: 指定分类,None表示所有分类
Returns:
dict: {category: [template_names]}
"""
templates = {}
if category:
categories = [category]
else:
categories = [d for d in os.listdir(self.templates_dir)
if os.path.isdir(os.path.join(self.templates_dir, d))]
for cat in categories:
cat_dir = os.path.join(self.templates_dir, cat)
if os.path.exists(cat_dir):
files = [f[:-5] for f in os.listdir(cat_dir)
if f.endswith('.json')]
templates[cat] = files
return templates
# 使用示例
manager = WorkflowTemplateManager()
# 保存模板
# workflow_data = {...} # 从ComfyUI导出的工作流
# manager.save_template(workflow_data, "portrait-v1", "text2img")
# 加载模板
workflow = manager.load_template("portrait-v1", "text2img")
# 列出所有模板
all_templates = manager.list_templates()
print("可用模板:")
for category, templates in all_templates.items():
print(f"\n{category}:")
for template in templates:
print(f" - {template}")版本控制建议:
-
使用Git管理
cd ComfyUI/workflows git init git add . git commit -m "初始工作流集合" -
命名规范
功能-风格-版本.json 例: text2img-realistic-v1.json img2img-anime-v2.json -
添加说明文档
# realistic-portrait-v1.json ## 功能 生成写实人像照片 ## 参数 - 模型:majicMIX realistic v7 - 分辨率:512x768 - 采样器:dpmpp_2m - 步数:28 ## 适用场景 商业摄影、产品展示、人像创作 ## 更新日志 - v1 (2025-12-27): 初始版本
最佳实践
提示词编写最佳实践
-
结构化组织
[主体] , [细节] , [环境] , [风格] , [质量] -
使用权重控制
(masterpiece:1.3), (best quality:1.2), highly detailed -
避免冲突描述
❌ 错误:realistic, anime style ✅ 正确:semi-realistic, anime-inspired -
利用负向提示词
始终包含:worst quality, low quality, blurry 根据需要添加:watermark, signature, text
参数调优最佳实践
-
渐进式调整
- 先固定大部分参数
- 每次只调整一个变量
- 观察效果后再继续
-
参数组合推荐
快速预览:steps=15, cfg=6 标准质量:steps=25, cfg=7.5 高质量:steps=30, cfg=8 -
分辨率阶梯
草图阶段:512x512 细化阶段:768x768 最终输出:1024x1024(通过Upscale)
工作流组织最佳实践
-
模块化设计
- 将常用节点组保存为模板
- 使用Group功能组织相关节点
- 添加注释说明节点用途
-
性能优化
- 避免不必要的预览节点
- 合理使用batch_size
- 显存不足时启用Tiling
-
备份策略
- 定期导出工作流JSON
- 使用云盘同步
- 重要工作流版本控制
总结
本文旨在使读者对ComfyUI有初步的了解,希望读者对AI图像生成有了初步的认识与入门,并对准备学习和正在学习ComfyUI的同学一些帮助和引导。
关键要点回顾:
-
ComfyUI优势
- 节点化工作流,灵活可控
- 显存优化,低配置友好
- 工作流可保存复用,效率高
-
模型选择
- SD 1.5:入门首选,生态完善
- SDXL:高质量,需更多显存
- 根据场景选择微调模型
-
核心技能
- 理解节点连接关系
- 编写高质量提示词
- 调优采样参数
-
进阶方向
- 自定义节点开发
- API自动化集成
- 工作流模板化管理
学习路径建议:
- 从默认文生图工作流开始
- 理解每个节点的作用
- 尝试修改参数观察效果
- 学习图生图、LoRA使用
- 探索ControlNet等高级功能
- 开发自定义节点或API集成
资源推荐:
- 官方文档:https://github.com/comfyanonymous/ComfyUI
- 社区论坛:https://www.reddit.com/r/comfyui/
- 模型下载:Civitai、哩布哩布AI
- 教程视频:B站搜索”ComfyUI教程”
祝你在AI图像生成的道路上越走越远!🎨