
简介面向 ComfyUI 用户的 QwenImageEdit 基础图生图工作流资源文件编号 c0051聚焦于 ComfyUI 生态内的图像编辑典型场景适合已在 ComfyUI 中完成基础环境搭建、希望快速掌握 QwenImageEdit 图生图流程的开发者压缩包内仅包含 1 个 JSON 文件大小约 3KB导入 ComfyUI 即可预览完整的节点连接关系无需手动搭建画布。已有 222 人学习或下载可作为本领域新手入门的参考。工作流覆盖输入图像加载、提示词配置与编辑模型调用等核心模块逻辑清晰便于读者对照界面节点理解图生图的基本链路同时可作为模板进一步扩展风格迁移、局部重绘等复杂实验结合配套的教程与开发指导可快速掌握从基础图生图到扩展应用的配置思路降低上手门槛。1. 先搞清楚 ComfyUI 里的 QwenImageEdit 在解决什么问题拿到一张图你真正想要的往往是「去掉背景里的路人」「把产品包装改成红色」这类精确改动。传统图生图靠整图重绘去逼近目标构图、质感容易一起漂移帽子加上了猫眼睛也歪了。ComfyUI 里接进 QwenImageEdit 之后编辑指令变成一句话原图进、指令进输出还是那张图只有被指令命中的部分改变。QwenImageEdit 属于 Qwen 系列的开源图像编辑模型把「怎么改」交给自然语言ComfyUI 负责把这些模型封装成可视化节点。「基础图生图」就是把图像加载、指令编码、采样、解码、保存这条最小链路串起来先让模型把图出对。这篇文章适合已经装好 ComfyUI、准备把手头图片改成目标样子的用户也适合从 SD 图生图工作流迁移过来、想快速对齐参数的工程师。2. 装环境ComfyUI 运行环境与 QwenImageEdit 模型的三种落地形态2.1 先定启动方式官方便携版、整合包还是现有 Python 环境装环境的第一步不是去下载模型而是先定从哪套 ComfyUI 跑。选择不同后面模型放的位置和踩到的坑完全不同。常见做法有三种。机器上还没有任何绘图环境时我一般建议用官方便携版它自带 Python 运行时解压后双击启动脚本即可依赖关系最简单社区节点对它的兼容性也最好。官方还有桌面版ComfyUI Desktop本质是同一个 core只是多了自动更新和模型管理适合不喜欢碰命令行的人。已经有 SD 或者之前研究过 ComfyUI 的人多半装的是秋叶整合包这类整合包带绘世启动器模型管理、插件安装、启动参数都做成图形界面胜在省事代价是里面的组件版本可能比官方源滞后插件装新不装旧时会遇到「节点能搜到但运行报错」。第三种是自己维护 Python 虚拟环境直接安装 ComfyUI适合本来就在跑其他 AI 任务、想复用同一套环境的情形但对依赖管理能力有要求升级一个库可能影响别的项目。提示三种方式最终都指向同一个 ComfyUI 服务端口默认 8188。选定了就不要在项目中途切换部署方式模型路径和节点版本会把你带回原点。2.2 模型文件放对位置checkpoints、diffusers 与社区节点包QwenImageEdit 在 ComfyUI 里没有唯一的存放位置放哪取决于你拿到的权重是什么形态以及你打算用哪类加载节点去读它。我见过最多的报错就是「模型下载下来了往 models 目录随便一丢然后界面里搜不到」。先把三类形态分清。模型形态推荐存放位置加载方式使用场景单文件 safetensors文本编码器与 VAE 已合并models/checkpoints原生 CheckpointLoaderSimple标准图生图链路最省事优先找这种Diffusers 格式的目录含 model_index.jsonmodels/diffusersDiffusersLoader 或社区对应加载器需要调试权重拼接、详细控制加载内容时社区节点包内置路径节点包目录内或models下自定义目录安装节点包后用专用 Loader 节点读取带「指令图像」双输入、支持多轮编辑的节点前两类都算模型层。单文件形态是社区里最流行的分发方式一个文件把文本编码器、扩散主干和 VAE 打包CheckpointLoaderSimple 读出来后CLIPTextEncode、KSampler、VAEDecode 全都认识它。用单文件时先确认它是否把文本编码器也并进来了如果模型页同时提供了单独的 text_encoder 文件按发布说明放到models/text_encoders下否则加载时会出现 key 对不上的报错。Diffusers 格式更像一个工程目录加载器会按 model_index.json 逐段组装适合准备对底层结构做改动的时候。第三类其实是插件的一部分模型权重跟着节点包走界面里多出来的专用节点会把图像和文本指令作为两个输入口追求多轮编辑体验的用户会选这条。选型逻辑很简单先看模型发布页给了哪几种下载格式优先拿单文件实在没有再退到 diffusers 目录并且把目录名改成不含空格、不含中文的短名字避免加载器解析出错。2.3 启动 ComfyUI 并确认模型被识别的最小命令模型放好之后先别急着画确认两件事ComfyUI 服务起来没有、新放进去的模型有没有被界面索引到。这两件事都能从启动日志里看出来。# 官方便携版Windows 下直接运行自带脚本也可以用命令行方式启动 # 本机调试用 127.0.0.1要让同网段设备访问时才改成 0.0.0.0 python main.py --listen 127.0.0.1 --port 8188 # 另开一个终端确认服务确实在监听 curl -s http://127.0.0.1:8188/system_stats | python -m json.tool | head -30 # 如果换了模型之后界面里搜不到重启一次进程再过滤启动日志 python main.py --listen 127.0.0.1 21 | tee comfy.log grep -iE qwen|checkpoint|error comfy.log | head -30第一段命令里--listen指定监听地址--port指定端口默认就是 8188写出来是为了让你知道这两个参数存在方便后面调 API 时对齐。/system_stats返回的是运行时信息能看到 torch 版本、设备类型curl 一下等于做探活。第三段把启动日志同时写进comfy.log过滤qwen关键字能确认模型加载时是否报过 name mismatch 之类的问题。启动成功后打开http://127.0.0.1:8188在画布上双击输入 qwen 或 imageedit如果下拉列表里出现了带 QwenImageEdit 关键字的节点说明环境这步过了没出现就回到 2.2检查文件扩展名是不是.safetensors、路径里有没有中文。3. 搭工作流从零连出一条可复现的 QwenImageEdit 图生图链路3.1 图生图工作流里的五个节点角色ComfyUI 的工作流本质是一张有向图「图生图」这类任务的角色划分比其他任务更固定。先把五个角色的职责记熟后面连线和排查都围绕它们展开。节点角色常见节点在本工作流里的职责图像入口LoadImage把原图读进工作流输出 IMAGE 张量文本入口CLIPTextEncode 或专用指令编码节点把编辑指令编码成 conditioning图像到潜空间VAEEncode把原图编码为 latent作为采样起点采样器KSampler在 latent 上执行去噪显存消耗的大头输出VAEDecode SaveImage把 latent 解码回像素并落盘理解这张表的关键是「两个空间」图像在像素空间模型在潜空间里工作。LoadImage 拿到的是像素必须经过 VAEEncode 转成 latent 才能进 KSamplerKSampler 出来的 latent 又要 VAEDecode 转回像素才能保存。很多人第一次连图生图最容易犯的错就是直接把 LoadImage 的 IMAGE 输出接到 KSampler 的 latent_image类型对不上节点立刻标红。如果走的是社区专用节点包角色会浓缩成「图像输入 指令输入 采样」几个大节点内部把编码拆开封装好了连线更少但排查问题时要能映射回这张表的职责否则报错信息会看不懂。3.2 最小链路怎么连两个容易接错的口最小链路我通常这么连LoadImage → VAEEncode → KSampler(latent_image)。文本走 CLIPTextEncode 分别得到 positive 与 negative conditioning接进 KSampler 的 positive/negative。KSampler 输出接 VAEDecode再进 SaveImage。整条链路不到十个节点属于「基础图生图」工作流的最小骨架。两个容易接错的口值得单独说。第一是 VAEEncode 的 vae 端口它要接 CheckpointLoaderSimple 里分离出来的 VAE 输出而很多人顺手把 KSampler 的 model 输出接到 vae 端口类型是 Model 而不是 VAE会直接报错。第二是 denoise 参数图生图里 denoise 控制重绘幅度1.0 表示完全不看原图等于把图生图当成文生图在跑做基础编辑时放在 0.35 到 0.6 之间改背景这种大动作用 0.7 往上。这个参数设错最容易出现的现象是「指令生效了但完全不是原来那张图」。提示第一次跑通之前把 KSampler 的 seed 固定成一个值不要在界面上反复点随机。工作流能不能复现先由 seed 决定。3.3 用 /prompt 接口把工作流跑起来在画布上手动跑通一次后把工作流导出成 API 格式的 JSON 文件以后所有重复劳动都可以脚本化。提交接口是/prompt代码不长。import json import time import requests # 读取你从画布上导出的工作流菜单里的 Save API Format with open(qwen_image_edit_workflow.json, r, encodingutf-8) as f: workflow json.load(f) # 提交任务ComfyUI 会把它推进执行队列 resp requests.post( http://127.0.0.1:8188/prompt, json{prompt: workflow, client_id: blog-demo}, ) resp.raise_for_status() # 轮询队列等任务从队列里消失 while True: queue requests.get(http://127.0.0.1:8188/queue).json() if not queue.get(queue_running): break time.sleep(1) print(workflow finished)这里有个细节json{prompt: workflow}里的 workflow 必须是「API 格式」而不是画布的存储格式。画布存的是带节点坐标、连线颜色的 UI 布局API 格式只保留class_type和inputs两层结构导出时选 API 那个入口导出结果可以直接被上面代码用。client_id不是必须的但填了之后能在/history里按这次会话追溯结果。任务跑完后输出图像会出现在ComfyUI/output目录按日期分目录保存。每次提交同一个 JSON、同样的 seed输出内容一致这意味着批量处理时只要改 LoadImage 的 image 字段就能换图重跑细节放到第 5 章。4. 参数设置让编辑贴合指令而不是乱画4.1 指令文本是图生图的第一个参数QwenImageEdit 的指令不是 tag 堆。用 Stable Diffusion 的习惯写「1girl, hat, red」这种标签句模型能读懂但控制力差因为它希望你描述的是「动作与变化」而不是「图片里的内容清单」。我一般按「对象 动作 范围 保留项」四段写。比如原图是街拍人像想加帽子「给画面中间的人戴一顶红色棒球帽帽檐略微遮挡额头人的表情、衣服、背景、光线都保持不变」。正面指令把「保持不变」写明确负面提示词里不要再复制一遍正面内容而是写「变形、多余的手指、文字、水印」这类破坏项。指令里每多一个位置限定词「画面中间的」「靠左第二个」编辑落点就越可控只写「加一顶帽子」模型倾向于把帽子放到最显眼、最好画的位置。如果想控制更细的结构基础图生图之后一般会叠加 ControlNet 这类前置控制那是进阶话题在基础阶段把指令写清楚比加任何插件都有效。4.2 采样参数与低显存配置下的取舍指令决定编辑方向采样参数决定编辑力度。表格里的推荐值对 QwenImageEdit 这类以自然语言为条件的模型基本适用注意它是参考区间而不是真理。参数作用基础编辑推荐值备注denoise重绘幅度图生图第一参数0.35 ~ 0.6换背景、换风格可到 0.7~0.85steps采样步数20 ~ 30超过 40 收益递减纯费时间cfg指令符合度3.5 ~ 7.0太低指令弱太高颜色过饱和seed随机种子固定一个值复现与对比时必填resolution工作流内的图像尺寸与原图一致不要在图生图里强行放大显存吃紧时优先做三件事启动参数加--lowvram让模型按需从显存卸载到内存batch_size 保持 1别在基础工作流里开批量把分辨率控制在原图同尺寸不要顺手放大再编辑。8G 显存的卡跑这类多模态编辑模型会比较紧张开--lowvram之后注意系统里别同时挂其他模型。如果节点包支持 SageAttention 或 Triton 加速可以分别打开试一下前者在 Attention 部分省显存开销后者提供更快的 kernel对低显存用户是免费午餐。4.3 结果不对时先查哪几个环节结果不满意时按顺序排查而不是先改参数。我把它压成一张「现象 → 先查什么」的表。现象优先排查输出和原图几乎一样指令没生效denoise 是否过低文本指令有没有接进 conditioningCLIPTextEncode 用的是不是模型自带的文本编码器变化很大构图完全不是原图denoise 是否设成了 1.0cfg 是否过高颜色怪异、饱和度异常cfg 过高或混杂了不匹配的 VAE采样中间报错、显存不足是否加了--lowvram分辨率是否被放大其他进程是否占显存每张输出都一样seed 固定且指令相同这是正常现象想变化就改 seed排查日志用命令# 显存不足、加载失败这类错误都会出现在 stderr 里 python main.py --listen 127.0.0.1 21 | tee comfy.log # 只挑重点错误行 grep -iE out of memory|torch.cuda|mismatch|error comfy.log | tail -50「指令没接进 conditioning」这条最常见画布上 CLIPTextEncode 确实存在但连线只接了 positive 没接 negative或者两个 conditioning 接反了。KSampler 的 positive 和 negative 角色不对称接反了画面会往「不要发生的事」那边跑。排查时先看连线再看参数最后才动模型权重。5. 进阶用法把 QwenImageEdit 图生图做成批量编辑与自动验证5.1 用固定 seed 批量换图重跑同一工作流手动在界面上跑一张没问题后批量只是把「换图」这一步脚本化。核心是先通过/upload/image上传拿到接口返回的文件名再改 workflow 里 LoadImage 节点的image字段继续走/prompt提交流程。import requests import json workflow json.load(open(qwen_image_edit_workflow.json, encodingutf-8)) # 找到 LoadImage 节点的 ID按你自己的画布结构调整 load_image_id 10 for image_file in [a.jpg, b.jpg, c.jpg]: with open(image_file, rb) as f: r requests.post( http://127.0.0.1:8188/upload/image, files{image: f}, data{overwrite: true}, ) name r.json()[name] workflow[load_image_id][inputs][image] name requests.post(http://127.0.0.1:8188/prompt, json{prompt: workflow}) print(fsubmitted {image_file} - {name})这里注意两点上传接口返回的name可能带子目录前缀不要自己拼路径直接用返回值一个任务没跑完就提交下一个也没关系ComfyUI 有队列机制会排队执行。批量场景里我会把overwrite设为 true避免同名文件被加上随机后缀打乱命名。5.2 用像素差异自动筛出「编辑生效」的结果批量跑完之后没人想一张张点开对比。用一个小脚本给每张图算平均绝对差MAD快速把「没编辑过」和「改过头」的结果挑出来。from PIL import Image import numpy as np def mad(src_path, out_path): a np.asarray(Image.open(src_path).convert(RGB), dtypenp.float32) b np.asarray(Image.open(out_path).resize(a.shape[1::-1]).convert(RGB), dtypenp.float32) return float(np.abs(a - b).mean()) # 经验阈值局部编辑一般在 10~50低于 5 视为几乎没生效 print(mad(src/a.jpg, output/edited_a.png))用这个值配合 4.2 里 denoise 的档位可以快速判断一批结果里哪些是「指令没生效」、哪些是「重绘太过」。MAD 只是粗筛想更可靠再叠加 SSIM 或直方图相似度而如果你要交付固定模板的结果可以把这套判断直接写进批处理脚本超出区间的图自动带着新的 seed 重新提交。本文还有配套的精品资源点击获取