Nunchaku FLUX.1 CustomV3代码实例自定义Save Image节点输出路径与批量命名逻辑1. 快速了解Nunchaku FLUX.1 CustomV3Nunchaku 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. 默认保存方式的问题虽然上述流程能够生成漂亮的图片但在实际使用中会发现几个不方便的地方保存路径固定所有图片都保存在默认位置无法按项目分类存放文件名随机生成的文件名是随机字符串无法直观看出图片内容手动操作繁琐每次生成后都需要右键保存批量处理时效率很低缺乏组织性大量图片堆放在同一文件夹后期整理困难这些问题在需要生成大量图片时会变得特别明显接下来我们通过修改代码来解决这些问题。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_prefixComfyUI, output_path, promptNone, extra_pnginfoNone): # 处理输出路径 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_okTrue) 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}.png5. 完整自定义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, strategyprompt_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_prefixCustomImage, output_path, naming_strategyprompt_based, promptNone, extra_pnginfoNone): # 处理输出路径 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_okTrue) 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_level4) return img6. 使用自定义节点的完整工作流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节点删除原有的Save Image节点添加Custom Save Image节点连接图像输出到新节点配置输出路径和命名策略6.3 配置示例在实际使用中可以这样配置自定义节点输出路径projects/my_artwork/character_design按项目分类文件名前缀fantasy_character基础名称命名策略prompt_based基于提示词生成有意义的名字这样生成的图片会保存在指定目录文件名类似fantasy_character_wizard_forest_20231201_1430_001.png7. 批量处理与自动化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: fbatch_{i} } # 调用ComfyUI API response requests.post( http://localhost:8188/prompt, json{prompt: workflow_data} ) results.append(response.json()) time.sleep(2) # 避免请求过于频繁 return results7.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 命名规范建议根据不同的使用场景可以采用不同的命名策略项目制命名项目名_类别_日期_序号.png客户制命名客户名_需求编号_版本号.png内容制命名基于提示词生成描述性文件名混合命名结合多种信息的综合命名方式8.3 性能考虑当处理大量图片时需要注意磁盘空间定期清理旧文件设置自动归档IO性能使用SSD硬盘提高保存速度内存管理批量处理时注意内存使用情况错误处理添加适当的异常处理和日志记录9. 总结通过自定义Nunchaku FLUX.1 CustomV3的Save Image节点我们成功解决了默认保存方式的几个痛点路径自定义可以按项目、日期或其他逻辑组织输出目录智能命名基于提示词生成有意义的文件名方便后续查找和管理批量处理支持自动化批量生成大大提高工作效率灵活配置提供多种命名策略和配置选项适应不同需求这个自定义方案不仅适用于Nunchaku FLUX.1 CustomV3也可以很容易地适配其他ComfyUI工作流。通过代码级的定制我们能够更好地控制图片生成的整个流程从提示词输入到最终的文件管理实现真正的高效工作流程。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Nunchaku FLUX.1 CustomV3代码实例:自定义Save Image节点输出路径与批量命名逻辑
Nunchaku FLUX.1 CustomV3代码实例自定义Save Image节点输出路径与批量命名逻辑1. 快速了解Nunchaku FLUX.1 CustomV3Nunchaku 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. 默认保存方式的问题虽然上述流程能够生成漂亮的图片但在实际使用中会发现几个不方便的地方保存路径固定所有图片都保存在默认位置无法按项目分类存放文件名随机生成的文件名是随机字符串无法直观看出图片内容手动操作繁琐每次生成后都需要右键保存批量处理时效率很低缺乏组织性大量图片堆放在同一文件夹后期整理困难这些问题在需要生成大量图片时会变得特别明显接下来我们通过修改代码来解决这些问题。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_prefixComfyUI, output_path, promptNone, extra_pnginfoNone): # 处理输出路径 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_okTrue) 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}.png5. 完整自定义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, strategyprompt_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_prefixCustomImage, output_path, naming_strategyprompt_based, promptNone, extra_pnginfoNone): # 处理输出路径 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_okTrue) 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_level4) return img6. 使用自定义节点的完整工作流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节点删除原有的Save Image节点添加Custom Save Image节点连接图像输出到新节点配置输出路径和命名策略6.3 配置示例在实际使用中可以这样配置自定义节点输出路径projects/my_artwork/character_design按项目分类文件名前缀fantasy_character基础名称命名策略prompt_based基于提示词生成有意义的名字这样生成的图片会保存在指定目录文件名类似fantasy_character_wizard_forest_20231201_1430_001.png7. 批量处理与自动化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: fbatch_{i} } # 调用ComfyUI API response requests.post( http://localhost:8188/prompt, json{prompt: workflow_data} ) results.append(response.json()) time.sleep(2) # 避免请求过于频繁 return results7.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 命名规范建议根据不同的使用场景可以采用不同的命名策略项目制命名项目名_类别_日期_序号.png客户制命名客户名_需求编号_版本号.png内容制命名基于提示词生成描述性文件名混合命名结合多种信息的综合命名方式8.3 性能考虑当处理大量图片时需要注意磁盘空间定期清理旧文件设置自动归档IO性能使用SSD硬盘提高保存速度内存管理批量处理时注意内存使用情况错误处理添加适当的异常处理和日志记录9. 总结通过自定义Nunchaku FLUX.1 CustomV3的Save Image节点我们成功解决了默认保存方式的几个痛点路径自定义可以按项目、日期或其他逻辑组织输出目录智能命名基于提示词生成有意义的文件名方便后续查找和管理批量处理支持自动化批量生成大大提高工作效率灵活配置提供多种命名策略和配置选项适应不同需求这个自定义方案不仅适用于Nunchaku FLUX.1 CustomV3也可以很容易地适配其他ComfyUI工作流。通过代码级的定制我们能够更好地控制图片生成的整个流程从提示词输入到最终的文件管理实现真正的高效工作流程。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。