当前位置: 首页 > news >正文

Nunchaku FLUX.1 CustomV3代码实例:自定义Save Image节点输出路径与批量命名逻辑

Nunchaku FLUX.1 CustomV3代码实例:自定义Save Image节点输出路径与批量命名逻辑

1. 快速了解Nunchaku FLUX.1 CustomV3

Nunchaku FLUX.1 CustomV3是一个基于Nunchaku FLUX.1-dev模型的文生图工作流程,它结合了FLUX.1-Turbo-Alpha和Ghibsky Illustration LoRAs技术,专门用于生成高质量的图片内容。这个定制版本在保持原模型强大生成能力的同时,通过优化的工作流程和额外的增强技术,让图片生成效果更加出色。

对于经常需要生成大量图片的用户来说,默认的图片保存方式可能不太方便。每次生成图片后都需要手动右键保存,而且文件名都是自动生成的随机字符,不方便后续管理和使用。本文将详细介绍如何通过修改Save Image节点的代码,实现自定义输出路径和批量命名功能。

2. 环境准备与基础操作

2.1 镜像选择与启动

要使用Nunchaku FLUX.1 CustomV3,首先需要选择对应的镜像。单张RTX4090显卡就能流畅运行,点击启动后进入ComfyUI界面。

2.2 工作流选择

在workflow选项卡中,选择nunchaku-flux.1-dev-myself工作流,这是已经配置好的完整图片生成流程。

2.3 提示词修改

找到CLIP节点,修改提示词内容,输入你想要的图片描述。好的提示词能让生成的图片更符合预期。

2.4 生成与保存图片

点击右上角Run按钮开始生成,等待片刻后就能看到结果。要保存图片,需要在Save Image节点上右键选择Save Image。

3. 默认保存方式的问题

虽然上述流程能够生成漂亮的图片,但在实际使用中会发现几个不方便的地方:

  1. 保存路径固定:所有图片都保存在默认位置,无法按项目分类存放
  2. 文件名随机:生成的文件名是随机字符串,无法直观看出图片内容
  3. 手动操作繁琐:每次生成后都需要右键保存,批量处理时效率很低
  4. 缺乏组织性:大量图片堆放在同一文件夹,后期整理困难

这些问题在需要生成大量图片时会变得特别明显,接下来我们通过修改代码来解决这些问题。

4. 自定义Save Image节点代码实现

4.1 找到Save Image节点源码

首先需要找到Save Image节点的实现代码。在ComfyUI中,节点的代码通常位于comfyui/web/extensions/core/目录下。我们可以通过修改或继承默认的SaveImage类来实现自定义功能。

import os import folder_paths from comfy.sd import VAEDecode from comfy.utils import common_upscale from nodes import SaveImage class CustomSaveImage(SaveImage): def __init__(self): super().__init__() self.output_dir = folder_paths.get_output_directory() self.type = "output" @classmethod def INPUT_TYPES(s): return { "required": { "images": ("IMAGE", ), "filename_prefix": ("STRING", {"default": "ComfyUI"}), "output_path": ("STRING", {"default": ""}), }, "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, }

4.2 实现自定义输出路径

上面的代码定义了基本的自定义保存节点,接下来我们实现路径自定义功能:

def save_images(self, images, filename_prefix="ComfyUI", output_path="", prompt=None, extra_pnginfo=None): # 处理输出路径 if output_path and output_path.strip(): # 使用自定义路径 full_output_folder = output_path.strip() # 确保路径存在 if not os.path.exists(full_output_folder): os.makedirs(full_output_folder, exist_ok=True) else: # 使用默认输出路径 full_output_folder = self.output_dir # 保存图片的逻辑(后续完善) results = list() # ... 图片保存实现 return {"ui": {"images": results}}

4.3 实现批量命名逻辑

为了生成有意义的文件名,我们可以基于提示词或其他信息来创建命名规则:

def generate_filename(self, prompt, prefix, index): """生成有意义的文件名""" if prompt and 'text' in prompt: # 从提示词提取关键词作为文件名 text = prompt['text'] # 简单处理:取前几个词,移除特殊字符 words = text.split()[:3] clean_words = [re.sub(r'[^a-zA-Z0-9]', '', word) for word in words] name_part = '_'.join(clean_words) else: name_part = prefix # 添加时间戳和索引确保唯一性 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") return f"{name_part}_{timestamp}_{index:04d}.png"

5. 完整自定义Save Image节点代码

下面是完整的自定义Save Image节点实现,支持路径自定义和智能命名:

import os import re import datetime import folder_paths from comfy.sd import VAEDecode from comfy.utils import common_upscale from nodes import SaveImage import numpy as np class CustomSaveImage(SaveImage): def __init__(self): super().__init__() self.output_dir = folder_paths.get_output_directory() self.type = "output" @classmethod def INPUT_TYPES(s): return { "required": { "images": ("IMAGE", ), "filename_prefix": ("STRING", {"default": "CustomImage"}), "output_path": ("STRING", {"default": ""}), "naming_strategy": (["prompt_based", "timestamp", "sequential"],), }, "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"}, } RETURN_TYPES = () FUNCTION = "save_images" OUTPUT_NODE = True CATEGORY = "image" def generate_filename(self, prompt, prefix, index, strategy="prompt_based"): """根据策略生成文件名""" if strategy == "prompt_based" and prompt: try: # 尝试从提示词提取有意义的部分 if '6' in prompt and 'inputs' in prompt['6']: text_input = prompt['6']['inputs']['text'] words = text_input.split()[:4] # 取前4个词 clean_words = [re.sub(r'[^a-zA-Z0-9_]', '', word) for word in words if word] if clean_words: name_base = '_'.join(clean_words) else: name_base = prefix else: name_base = prefix except: name_base = prefix elif strategy == "timestamp": name_base = prefix else: name_base = prefix # 添加时间戳和序号 timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") return f"{name_base}_{timestamp}_{index:03d}.png" def save_images(self, images, filename_prefix="CustomImage", output_path="", naming_strategy="prompt_based", prompt=None, extra_pnginfo=None): # 处理输出路径 if output_path and output_path.strip(): full_output_folder = output_path.strip() if not os.path.isabs(full_output_folder): # 相对路径转为绝对路径 full_output_folder = os.path.join(self.output_dir, full_output_folder) else: full_output_folder = self.output_dir # 创建目录(如果不存在) os.makedirs(full_output_folder, exist_ok=True) results = list() for index, image in enumerate(images): # 生成文件名 filename = self.generate_filename(prompt, filename_prefix, index, naming_strategy) # 完整的文件路径 file_path = os.path.join(full_output_folder, filename) # 保存图片(使用父类的保存逻辑) img = self.export_image(image, file_path) results.append({ "filename": filename, "subfolder": "", "type": self.type }) return {"ui": {"images": results}} def export_image(self, image, file_path): """导出图片到指定路径""" # 将tensor转换为numpy数组 i = 255. * image.cpu().numpy() img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) # 保存图片 img.save(file_path, compress_level=4) return img

6. 使用自定义节点的完整工作流

6.1 注册自定义节点

要使用自定义的Save Image节点,需要先将其注册到ComfyUI中。创建或修改custom_nodes/custom_save_image/__init__.py文件:

from .custom_save_image import CustomSaveImage NODE_CLASS_MAPPINGS = { "CustomSaveImage": CustomSaveImage } NODE_DISPLAY_NAME_MAPPINGS = { "CustomSaveImage": "Custom Save Image" }

6.2 修改工作流使用自定义节点

在ComfyUI界面中,将原来的Save Image节点替换为我们的Custom Save Image节点:

  1. 删除原有的Save Image节点
  2. 添加Custom Save Image节点
  3. 连接图像输出到新节点
  4. 配置输出路径和命名策略

6.3 配置示例

在实际使用中,可以这样配置自定义节点:

  • 输出路径projects/my_artwork/character_design(按项目分类)
  • 文件名前缀fantasy_character(基础名称)
  • 命名策略prompt_based(基于提示词生成有意义的名字)

这样生成的图片会保存在指定目录,文件名类似:fantasy_character_wizard_forest_20231201_1430_001.png

7. 批量处理与自动化

7.1 实现批量生成功能

通过API调用可以实现完全自动化的批量图片生成:

import requests import json import time def batch_generate_images(prompts, output_base_path): """批量生成图片到指定路径""" results = [] for i, prompt_text in enumerate(prompts): # 构建工作流数据 workflow_data = { "prompt": prompt_text, "output_path": f"{output_base_path}/batch_{i}", "filename_prefix": f"batch_{i}" } # 调用ComfyUI API response = requests.post( "http://localhost:8188/prompt", json={"prompt": workflow_data} ) results.append(response.json()) time.sleep(2) # 避免请求过于频繁 return results

7.2 定时任务与监控

对于需要长时间运行的任务,可以设置监控和重试机制:

import schedule import logging def scheduled_generation_task(): """定时生成任务""" try: prompts = load_prompts_from_file("daily_prompts.txt") output_path = f"/output/daily/{datetime.date.today()}" results = batch_generate_images(prompts, output_path) logging.info(f"生成完成,共{len(results)}张图片") except Exception as e: logging.error(f"生成任务失败: {str(e)}") # 每天上午10点执行 schedule.every().day.at("10:00").do(scheduled_generation_task)

8. 实际应用效果与建议

8.1 文件组织效果

使用自定义Save Image节点后,你的图片输出目录会变得井井有条:

output/ ├── project_a/ │ ├── character_design_20231201_1000_001.png │ ├── landscape_20231201_1005_002.png │ └── object_20231201_1010_003.png ├── project_b/ │ ├── concept_art_20231202_1100_001.png │ └── storyboard_20231202_1115_002.png └── daily/ └── 20231201/ ├── morning_session/ └── afternoon_session/

8.2 命名规范建议

根据不同的使用场景,可以采用不同的命名策略:

  1. 项目制命名项目名_类别_日期_序号.png
  2. 客户制命名客户名_需求编号_版本号.png
  3. 内容制命名:基于提示词生成描述性文件名
  4. 混合命名:结合多种信息的综合命名方式

8.3 性能考虑

当处理大量图片时,需要注意:

  1. 磁盘空间:定期清理旧文件,设置自动归档
  2. IO性能:使用SSD硬盘提高保存速度
  3. 内存管理:批量处理时注意内存使用情况
  4. 错误处理:添加适当的异常处理和日志记录

9. 总结

通过自定义Nunchaku FLUX.1 CustomV3的Save Image节点,我们成功解决了默认保存方式的几个痛点:

  1. 路径自定义:可以按项目、日期或其他逻辑组织输出目录
  2. 智能命名:基于提示词生成有意义的文件名,方便后续查找和管理
  3. 批量处理:支持自动化批量生成,大大提高工作效率
  4. 灵活配置:提供多种命名策略和配置选项,适应不同需求

这个自定义方案不仅适用于Nunchaku FLUX.1 CustomV3,也可以很容易地适配其他ComfyUI工作流。通过代码级的定制,我们能够更好地控制图片生成的整个流程,从提示词输入到最终的文件管理,实现真正的高效工作流程。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/542511/

相关文章:

  • PyTorch 3.0分布式静态图训练稳定性攻坚(解决torch.compile在多机多卡下non-deterministic graph recompilation问题的4种生产级方案)
  • RWKV7-1.5B-g1a保姆级部署教程:离线加载+免外网依赖,中小企业AI落地首选
  • 5分钟搞定OpenClaw:nanobot镜像云端体验与自动化测试
  • Source Han Serif CN 深度解析:7字重开源字体的全场景实战指南
  • 三相桥式逆变器(SVPWM)在三相不平衡电压下并网逆变器并网控制探究
  • 神经信号干扰器:让脑机监控读取错误数据——软件测试从业者的专业视角
  • 数据选择器与数值比较器的实战应用:74LS151和74LS138的8位数据传输电路设计
  • LFM2.5-1.2B-Thinking-GGUF实战:使用Xshell远程连接服务器部署与管理模型服务
  • 新手也能搞懂:用Cisco Packet Tracer模拟BGP多AS互联(附完整配置与排错)
  • IndexTTS2 V23功能体验:情感强度自由调节,打造个性化语音
  • DeepSeek-OCR-2解决文档数字化难题:复杂表格精准识别转Markdown
  • 创意无限:用Qwen-Image-2512-SDNQ生成独特书法作品,简单易上手
  • 革新性游戏体验:League-Toolkit效率倍增方案,MOBA玩家的自动化操作与智能分析解决方案
  • 如何永久保存微信聊天记录?WeChatMsg让你的对话变成数字资产
  • 美军地面入侵伊朗的可能性分析
  • Wan2.2-I2V-A14B惊艳效果:光影变化自然、镜头运动平滑的专业级视频生成
  • SenseVoice-Small ONNX目标检测集成:基于YOLOv8的语音视觉融合系统
  • Qwen3.5小尺寸模型开源,9B碾压GPT开源版,消费级显卡就能跑
  • 为SDMatte开发VS Code插件:提升本地开发调试效率
  • 树莓派4B变身家庭无线AP:5分钟搞定桥接模式(附避坑指南)
  • STM32F103引脚功能全解析:从供电到通信接口的实战配置指南
  • 物联网操作系统选型
  • FreeRTOS StreamBuffer vs MessageBuffer:如何选择最适合你的通信方式?
  • SDPose-Wholebody在QT跨平台应用中的集成实战
  • 不想让客户看到源码?手把手教你用Keil MDK把关键驱动打包成Lib库(附完整流程)
  • 立知多模态重排序模型入门:快速理解单文档评分与批量重排序
  • YOLO12工业质检效果:螺丝/焊点/划痕等小目标检测边界框展示
  • COMSOL 探索岩石力学多场景:损伤、压裂、试验与模拟
  • 浙江乒乓球拍底板优选:2026服务好的工厂大揭秘,乒乓球拍专业胶皮/篮球5号球,乒乓球拍底板供货厂家口碑推荐分析 - 品牌推荐师
  • 屏幕标注高效解决方案:gInk让演示重点一目了然