跳转至

07-自定义节点与扩展

ComfyUI自定义节点与扩展示意图

🎯 学习目标

  • 熟练使用 ComfyUI Manager 管理自定义节点
  • 了解热门自定义节点包及其功能
  • 入门自定义节点开发(Python 节点编写基础)
  • 实现一个简单的自定义图像处理节点
  • 了解工作流模板社区资源

7.1 ComfyUI Manager 使用指南

7.1.1 安装 Manager

如果尚未安装,请参考 02-环境搭建与安装 中的 Manager 安装章节。

7.1.2 Manager 界面功能

打开 Manager 后,可以看到以下功能选项:

按钮 功能 说明
Install Custom Nodes 搜索安装节点 浏览和安装社区节点
Install Missing Custom Nodes 安装缺失节点 自动检测工作流所需的缺失节点
Install via Git URL Git URL 安装 通过 GitHub URL 安装节点
Update All 全部更新 一键更新所有已安装节点
Fetch Updates 获取更新信息 检查可用更新
Alternatives of A1111 WebUI 替代方案 查找 WebUI 扩展的 ComfyUI 替代品

7.1.3 搜索和安装节点

  1. 点击 Install Custom Nodes
  2. 在搜索框输入关键词(如 "controlnet"、"face"、"video")
  3. 浏览搜索结果,点击 Install 按钮
  4. 等待安装完成,重启 ComfyUI
Text Only
示例:安装 ComfyUI Impact Pack
1. Manager → Install Custom Nodes
2. 搜索 "Impact Pack"
3. 找到 "ComfyUI-Impact-Pack" → Install
4. 重启 ComfyUI

7.1.4 更新节点

Text Only
方法一:Manager → Update All(更新所有节点)
方法二:Manager → Install Custom Nodes → 找到节点 → Update
方法三:手动更新
    cd custom_nodes/节点目录
    git pull

7.1.5 禁用和卸载节点

  • 禁用:Manager → Install Custom Nodes → 已安装列表 → Disable(节点代码保留但不加载)
  • 卸载:Manager → Install Custom Nodes → 已安装列表 → Uninstall(删除节点代码)

💡 提示:如果某个节点导致 ComfyUI 启动失败,可以在启动前手动将 custom_nodes/ 中对应的文件夹重命名(如加 _disabled 后缀),阻止其加载。

7.1.6 安装缺失节点

当你导入一个工作流但缺少部分自定义节点时:

  1. 加载工作流(节点会显示为红色/缺失状态)
  2. 点击 Manager → Install Missing Custom Nodes
  3. Manager 会列出所有缺失节点及对应的节点包
  4. 一键安装所有缺失节点
  5. 重启 ComfyUI

⚠️ 注意:并非所有缺失节点都能在 Manager 数据库中找到。某些私人或过时的节点可能需要手动安装。


7.2 热门自定义节点推荐(Top 20)

7.2.1 必装节点

排名 节点包 功能说明 推荐度
1 ComfyUI Manager 节点管理器 ⭐⭐⭐⭐⭐
2 ComfyUI-Impact-Pack 面部检测/修复/增强、SAM 分割 ⭐⭐⭐⭐⭐
3 ComfyUI Controlnet Aux ControlNet 预处理器集合 ⭐⭐⭐⭐⭐
4 WAS Node Suite 300+ 图像处理/工具节点 ⭐⭐⭐⭐⭐
5 rgthree-comfy 工作流增强(Seed、Mute等) ⭐⭐⭐⭐⭐

7.2.2 效率与工具类

排名 节点包 功能说明 推荐度
6 efficiency-nodes-comfyui 合并常用操作、XY Plot ⭐⭐⭐⭐
7 Comfyroll Studio 大量实用工具节点 ⭐⭐⭐⭐
8 ComfyUI-Custom-Scripts 自动完成、图像浏览等增强 ⭐⭐⭐⭐
9 ComfyUI-KJNodes 条件控制、遮罩操作增强 ⭐⭐⭐⭐
10 cg-use-everywhere 简化连线(无线传输数据) ⭐⭐⭐⭐

7.2.3 图像处理与生成增强

排名 节点包 功能说明 推荐度
11 ComfyUI-IPAdapter-Plus IP-Adapter 完整实现 ⭐⭐⭐⭐⭐
12 ComfyUI-AnimateDiff-Evolved AnimateDiff 视频生成 ⭐⭐⭐⭐
13 ComfyUI_InstantID 面部一致性生成 ⭐⭐⭐⭐
14 ComfyUI_FaceAnalysis 面部分析与交换 ⭐⭐⭐⭐
15 ComfyUI-GGUF GGUF 量化模型支持 ⭐⭐⭐⭐

7.2.4 视频与特效

排名 节点包 功能说明 推荐度
16 ComfyUI-VideoHelperSuite 视频加载/保存/处理 ⭐⭐⭐⭐
17 ComfyUI-Frame-Interpolation 帧插值(RIFE等) ⭐⭐⭐
18 ComfyUI-Advanced-ControlNet ControlNet 高级功能 ⭐⭐⭐⭐
19 ComfyUI Segment Anything SAM 图像分割 ⭐⭐⭐⭐
20 ComfyUI-Prompt-Control 高级提示词控制 ⭐⭐⭐

7.2.5 各节点详细介绍

WAS Node Suite

300+ 节点的超级工具包,涵盖图像处理的方方面面:

  • 图像混合、裁剪、旋转、翻转
  • 色彩调整(亮度、对比度、色调)
  • 文本渲染与叠加
  • 数学运算与逻辑控制
  • 文件系统操作

ComfyUI Impact Pack

专注于面部和细节处理:

  • FaceDetailer:自动检测面部并精修细节
  • SAM Detector:Segment Anything 分割
  • BBOX Detector:物体检测
  • Detailer:局部细节增强
Text Only
# FaceDetailer 典型用法
原始图像 → FaceDetailer
    ├── model: [Checkpoint MODEL]
    ├── clip: [CLIP]
    ├── vae: [VAE]
    ├── positive: [正向条件]
    ├── negative: [反向条件]
    ├── bbox_detector: [UltraDetailer 检测器]
    └── IMAGE (面部精修后的图像)

rgthree-comfy

工作流管理和开发效率增强:

  • Seed:更好的种子管理节点
  • Mute/Unmute:批量静音控制
  • Fast Groups Muter:快速切换节点组
  • Power Lora Loader:增强的 LoRA 加载器
  • Node Bookmark:节点书签导航

efficiency-nodes-comfyui

提高工作效率的合并节点:

  • Efficient Loader:合并加载模型+编码提示词
  • KSampler (Efficient):合并采样+预览
  • XY Plot:参数对比网格图

7.3 自定义节点开发入门

7.3.1 节点开发基础

ComfyUI 的自定义节点使用 Python 编写,核心是一个 Python 类,通过特定的类属性和方法与 ComfyUI 框架交互。

文件结构

Text Only
ComfyUI/custom_nodes/
└── my_custom_nodes/
    ├── __init__.py         # 节点注册入口
    ├── nodes.py            # 节点实现
    └── requirements.txt    # 额外依赖(可选)

7.3.2 节点类结构

Python
class MyCustomNode:
    """
    一个自定义节点的基本结构
    """

    # 节点在菜单中的分类
    CATEGORY = "my_nodes"

    # 返回类型(输出的数据类型)
    RETURN_TYPES = ("IMAGE",)

    # 返回名称
    RETURN_NAMES = ("image",)

    # 执行函数名
    FUNCTION = "execute"

    @classmethod
    def INPUT_TYPES(cls):
        """定义节点的输入接口"""
        return {
            "required": {
                "image": ("IMAGE",),                    # 图像输入
                "brightness": ("FLOAT", {               # 浮点数参数
                    "default": 1.0,
                    "min": 0.0,
                    "max": 3.0,
                    "step": 0.1,
                    "display": "slider"
                }),
            },
            "optional": {
                "mask": ("MASK",),                      # 可选的遮罩输入
            }
        }

    def execute(self, image, brightness, mask=None):
        """
        节点的执行逻辑
        输入参数与 INPUT_TYPES 中定义的一致
        返回元组,与 RETURN_TYPES 对应
        """
        result = image * brightness
        return (result,)

7.3.3 注册节点

__init__.py 中注册节点:

Python
from .nodes import MyCustomNode

# 节点类映射(内部名称 → 类)
NODE_CLASS_MAPPINGS = {
    "MyCustomNode": MyCustomNode,
}

# 节点显示名称映射(内部名称 → 界面显示名称)
NODE_DISPLAY_NAME_MAPPINGS = {
    "MyCustomNode": "My Custom Node ✨",
}

7.3.4 数据类型参考

类型 Python 格式 说明
IMAGE torch.Tensor (B,H,W,C) float32 0~1 图像批次
MASK torch.Tensor (H,W) 或 (B,H,W) float32 0~1 遮罩
LATENT dict 潜空间数据
MODEL ModelPatcher 对象 SD 模型
CLIP CLIP 对象 文本编码器
VAE VAE 对象 VAE 模型
CONDITIONING list[tuple] 条件编码
INT int 整数
FLOAT float 浮点数
STRING str 字符串
BOOLEAN bool 布尔值

💡 提示:ComfyUI 中的 IMAGE 类型是 (Batch, Height, Width, Channels) 格式(BHWC),且值范围是 0~1 的 float32。这与 PyTorch 常用的 BCHW 格式不同,需要注意转换。


7.4 节点开发示例:创建一个简单的图像处理节点

7.4.1 项目:亮度/对比度调节节点

我们来创建一个同时调节亮度和对比度的节点。

创建目录和文件

Bash
mkdir -p ComfyUI/custom_nodes/comfy_brightness_contrast

7.4.2 实现节点(nodes.py)

Python
# ComfyUI/custom_nodes/comfy_brightness_contrast/nodes.py

import torch

class BrightnessContrastNode:
    """
    调节图像的亮度和对比度

    用法:
    - brightness > 1.0 增加亮度,< 1.0 降低亮度
    - contrast > 1.0 增加对比度,< 1.0 降低对比度
    """

    CATEGORY = "image/adjustments"
    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("image",)
    FUNCTION = "adjust"

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "image": ("IMAGE",),
                "brightness": ("FLOAT", {
                    "default": 1.0,
                    "min": 0.0,
                    "max": 3.0,
                    "step": 0.05,
                    "display": "slider"
                }),
                "contrast": ("FLOAT", {
                    "default": 1.0,
                    "min": 0.0,
                    "max": 3.0,
                    "step": 0.05,
                    "display": "slider"
                }),
            }
        }

    def adjust(self, image: torch.Tensor, brightness: float, contrast: float):
        """
        image: Tensor (B, H, W, C) 范围 [0, 1]
        brightness: 亮度系数
        contrast: 对比度系数
        """
        # 亮度调节
        result = image * brightness

        # 对比度调节(以 0.5 为中心)
        mean = 0.5
        result = (result - mean) * contrast + mean

        # 限制范围到 [0, 1]
        result = torch.clamp(result, 0.0, 1.0)

        return (result,)

class ImageInvertNode:
    """
    反转图像颜色(负片效果)
    """

    CATEGORY = "image/adjustments"
    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("image",)
    FUNCTION = "invert"

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "image": ("IMAGE",),
                "strength": ("FLOAT", {
                    "default": 1.0,
                    "min": 0.0,
                    "max": 1.0,
                    "step": 0.1,
                    "display": "slider"
                }),
            }
        }

    def invert(self, image: torch.Tensor, strength: float):
        """
        将图像颜色反转,strength 控制反转强度
        strength = 1.0 完全反转,0.0 不变
        """
        inverted = 1.0 - image
        result = image * (1 - strength) + inverted * strength
        return (result,)

7.4.3 注册入口(init.py)

Python
# ComfyUI/custom_nodes/comfy_brightness_contrast/__init__.py

from .nodes import BrightnessContrastNode, ImageInvertNode

NODE_CLASS_MAPPINGS = {
    "BrightnessContrast": BrightnessContrastNode,
    "ImageInvert": ImageInvertNode,
}

NODE_DISPLAY_NAME_MAPPINGS = {
    "BrightnessContrast": "Brightness & Contrast 🔆",
    "ImageInvert": "Image Invert 🔄",
}

__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"]

7.4.4 测试节点

  1. 重启 ComfyUI
  2. 在画布右键 → Add Node → image/adjustments → 找到 "Brightness & Contrast 🔆"
  3. 连接一个图像源到输入,输出连接 PreviewImage
  4. 调节滑块观察效果

7.4.5 进阶:添加交互式控件

ComfyUI 支持多种参数控件类型:

Python
@classmethod  # @classmethod类方法,第一个参数为类本身
def INPUT_TYPES(cls):
    return {
        "required": {
            # 下拉选择
            "mode": (["normal", "multiply", "screen", "overlay"],),

            # 整数输入
            "size": ("INT", {
                "default": 512, "min": 64, "max": 4096, "step": 64
            }),

            # 多行文本
            "text": ("STRING", {
                "multiline": True,
                "default": "hello world"
            }),

            # 布尔开关
            "enabled": ("BOOLEAN", {"default": True}),
        }
    }

⚠️ 注意:自定义节点开发中,请确保所有 tensor 操作使用 PyTorch 方法,避免将大型 tensor 转换为 NumPy(会占用额外内存)。如果必须使用 NumPy,处理完后及时转回 tensor。


7.5 工作流模板社区资源

7.5.1 官方资源

资源 地址 说明
ComfyUI Examples https://comfyanonymous.github.io/ComfyUI_examples/ 官方示例工作流
ComfyUI Docs https://docs.comfy.org/ 官方文档

7.5.2 社区平台

平台 地址 特点
OpenArt https://openart.ai/workflows 最大的工作流分享平台
Civitai https://civitai.com/ 模型+工作流一体化社区
ComfyWorkflows https://comfyworkflows.com/ 专注工作流分享
GitHub 搜索 "comfyui workflow" 开源工作流项目

7.5.3 使用社区工作流的流程

Text Only
1. 在社区平台浏览并下载工作流 JSON

2. 在 ComfyUI 中导入(Ctrl+O 或拖入)

3. 如果有红色(缺失)节点:
   → Manager → Install Missing Custom Nodes
   → 安装所有缺失节点
   → 重启 ComfyUI

4. 检查工作流所需的模型:
   → 查看加载器节点中指定的模型名称
   → 下载缺失的模型到对应目录

5. 调整参数并运行

7.5.4 创建可分享的工作流

为了让你的工作流更容易被他人使用:

  • 使用通用模型名称(如官方模型名,而非个人重命名)
  • 添加 Note 节点说明工作流用途和参数含义
  • 使用分组(Group)组织节点
  • 标注所需的自定义节点包名称
  • 提供示例输出图像作为参考
  • 注明推荐的硬件配置

练习

  1. 通过 Manager 安装以下节点包:Impact Pack、WAS Node Suite、rgthree-comfy
  2. 使用 Impact Pack 的 FaceDetailer 节点改善一张人像图片的面部细节
  3. 从 OpenArt 下载一个社区工作流,安装所有缺失节点并成功运行
  4. 按照示例代码创建 BrightnessContrast 自定义节点并测试
  5. 尝试修改示例代码,添加一个"饱和度调节"功能

延伸阅读


📌 下一章08-实战项目 —— 综合运用所学知识完成完整的 ComfyUI 项目


最后更新日期:2026-02-12 适用版本:ComfyUI实战教程 v2026