关于 qwen-image-edit
这是一份使用 Qwen Image Edit 根据自然语言指令编辑图像的 ComfyUI 技能指南,涵盖模型与节点选择、潜空间和分辨率处理、采样设置及工作流示例。
主要功能
- 01模型与条件节点指南
- 02潜空间与源图对齐
- 03采样预设与 Lightning LoRA
- 04图像编辑提示词模式
- 05ComfyUI 工作流示例
适用场景
- 01搭建自然语言图像编辑工作流
- 02选择更快的 Lightning 采样设置
- 03排查参考图与输出潜空间不匹配
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ artokun/ comfyui-mcp --skill qwen-image-edit安装后在 Claude Code 中输入/qwen-image-edit确认已加载。
详细介绍
Qwen Image Edit 工作流
概述
Qwen Image Edit 使用视觉语言模型(Qwen2.5-VL),根据自然语言指令编辑图像。模型通过 CLIP 条件信息“查看”源图像,并生成编辑后的版本。
模型
必需组件
| 组件 | 节点 | 模型名称 | 备注 |
|---|---|---|---|
| UNET | UNETLoader | qwen_image_edit_2511_bf16.safetensors | 官方 2511 编辑模型(bf16) |
| CLIP | CLIPLoader (type=qwen_image) | qwen_2.5_vl_7b_fp8_scaled.safetensors | 所有 Qwen 模型共用 |
| VAE | VAELoader | qwen_image_vae.safetensors | Qwen 专用 VAE |
替代 UNET 模型
| 模型 | 路径 | 侧重点 |
|---|---|---|
qwenImageEditRemix_v10 | qwenImageEditRemix_v10.safetensors | 社区改版,通用编辑 |
qwenUltimateRealism_v11 | Qwen/imageized/qwenUltimateRealism_v11.safetensors | 产品摄影,超写实 |
copaxTimeless | Qwen/realistic/copaxTimeless_qwenUltraRealistic.safetensors | 超写实人像 |
qwnImageEdit_v16Bf16 | Qwen/abliterated/qwnImageEdit_v16Bf16.safetensors | 消除审查(不受限制) |
条件节点
TextEncodeQwenImageEditPlusAdvance_lrzjason(推荐)
来自 qweneditutils 自定义节点包。推荐使用 Advanced 版本,因为它:
- 直接输出 LATENT(无需单独使用 EmptyLatentImage)
- 提供独立的 VL-resize 和不调整大小图像插槽,便于精细控制
- 支持通过 target_size 控制输出分辨率
- 包含填充/居中/禁用裁剪方法,并输出 pad_info
Required Inputs:
- clip: CLIP
- prompt: STRING — natural language edit instruction
Optional Inputs:
- vae: VAE — needed for image encoding and latent output
- vl_resize_image1-3: IMAGE — images that get VL-resized (downscaled for vision encoder)
- not_resize_image1-3: IMAGE — images kept at full resolution
- target_size: [1024, 1344, 1536, 2048, 768, 512] (default 1024)
- target_vl_size: [392, 384] (default 384)
- upscale_method: [lanczos, bicubic, area]
- crop_method: [pad, center, disabled]
- instruction: STRING — system instruction template (has sensible default)
Outputs (10):
[0] conditioning_with_full_ref: CONDITIONING — use as positive conditioning
[1] latent: LATENT — auto-scaled latent, feed directly to KSampler
[2] target_image1: IMAGE — processed target-size image
[3] target_image2: IMAGE
[4] target_image3: IMAGE
[5] vl_resized_image1: IMAGE — VL-resized version
[6] vl_resized_image2: IMAGE
[7] vl_resized_image3: IMAGE
[8] conditioning_with_first_ref: CONDITIONING — conditioning with only first ref
[9] pad_info: ANY — padding info for later unpadding
主要优势:输出 [1](latent)无需单独使用 EmptyLatentImage 或 VAEEncode 节点。Advanced 节点会在内部按正确分辨率创建 latent。
其他条件节点变体
- TextEncodeQwenImageEditPlus(Phr00t v2,内置)更简单:有 4 个图像输入,仅输出 CONDITIONING。需要单独使用 EmptyLatentImage。适合快速编辑。
- TextEncodeQwenImageEditPlus_lrzjason:有 5 个图像输入和调整大小开关,但控制能力不如 Advance
- TextEncodeQwenImageEditPlusPro_lrzjason:通过
vl_resize_indexs字符串逐图选择 VL 调整大小,并提供main_image_index控制
Lightning LoRA(快速生成)
4 步 Lightning(2511 Edit)
{
"class_type": "LoraLoaderModelOnly",
"inputs": {
"model": ["<unet_node>", 0],
"lora_name": "Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors",
"strength_model": 1.0
}
}
设置:steps=4,cfg=1.0,sampler=euler,scheduler=simple,denoise=1.0
4 步 Lightning(通用 Qwen)
适用于非编辑模型(txt2img、2512):
Qwen-Image-Lightning-4steps-V1.0.safetensors(强度 1.0)
8 步 Lightning
Qwen-Image-Lightning-8steps-V1.0.safetensors,细节比 4 步版本更多
采样器设置
| 预设 | 步数 | CFG | 采样器 | 调度器 | 去噪 | LoRA |
|---|---|---|---|---|---|---|
| Lightning 4 步(2511 edit) | 4 | 1.0 | euler | simple | 1.0 | 2511-Lightning-4steps |
| Lightning 8 步 | 8 | 1.0 | euler | simple | 1.0 | Lightning-8steps |
| 标准编辑 | 40 | 4.0 | euler | simple | 0.75 | 无 |
| 高质量编辑 | 50 | 4.0 | euler | simple | 0.5-0.8 | 无 |
去噪值低于 1.0 的行必须使用
VAEEncode潜变量。 去噪值足够低时会缩短采样计划——而 0.5-0.8 显然符合这一条件——因此会保留一部分输入潜变量,所以该潜变量必须是源图像。将latent_image接到源图像的VAEEncode输出(或接到生成源图像派生潜变量的节点,例如TextEncodeQwenImageEditPlusAdvance_lrzjason输出 [1])。将这些行与EmptyLatentImage搭配使用时,流程会正常运行并返回一片平坦、近乎均匀的区域——空潜变量没有可保留的源内容。通过TextEncodeQwenImageEditPlus输入参考图也无法解决这个问题:该图像会进入 CONDITIONING,只会引导去噪,不会作为采样器的初始状态。
编辑时的去噪值:去噪值越低,结果越接近源图像——前提是潜变量就是源图像。使用 VAEEncode 潜变量进行标准编辑时,去噪值范围为 0.5-0.8。Lightning 使用 1.0(模型会在内部处理保真度)。
分辨率
此表适用于 Qwen-Image 文本生成图像。请勿据此选择编辑图工作流的输出尺寸。 编辑图工作流的尺寸由源图像决定,而非由你选择——请参见下文的“编辑图工作流的分辨率”。在此选择 1104x1472 用于编辑的问题编号是 #2681。
Qwen-Image 的原生分辨率约为 1.6 百万像素:
| 宽高比 | 分辨率 | 用途 |
|---|---|---|
| 正方形 | 1328x1328 | 通用 |
| 纵向 3:4 | 1104x1472 | 人像 |
| 纵向 9:16 | 928x1664 | 手机格式 |
| 横向 4:3 | 1472x1104 | 风景场景 |
| 横向 16:9 | 1664x928 | 宽屏 |
| 视频就绪 | 832x480 | 用于 WAN 2.2 FLF 流程 |
用于视频流程:使用 832x480,以匹配 WAN 2.2 的默认分辨率。
编辑图上的分辨率
TextEncodeQwenImageEdit 和 TextEncodeQwenImageEditPlus 不接受尺寸参数。它们会将每张参考图缩放到硬编码的 int(1024 * 1024) 像素——约 1.05 MP,并保持源图的宽高比——对其进行 VAE 编码,再将其作为参考潜变量传给模型(comfy_extras/nodes_qwen.py)。
随后,模型会将参考图词元和正在生成的词元放在同一个居中坐标网格上(comfy/ldm/qwen_image/model.py,process_img),因此只有两个网格尺寸相同时,参考位置 (i, j) 和输出位置 (i, j) 才表示同一个位置。这就是官方模板先将图像送入 FluxKontextImageScale,再将该缩放后图像的 VAEEncode 结果传给采样器的全部原因——这样,两个分支看到的像素相同、缩放比例相同(约 1 MP),宽高比也相同。所有 PREFERRED_KONTEXT_RESOLUTIONS 条目也都是约 1.05 MP,原因相同。
两者只需在编码器按 8 取整的范围内一致,并非完全相等;准确了解差异很有必要。FluxKontextImageScale 会对齐到一个首选尺寸对;随后,编码器会根据自身的 1,048,576 像素预算重新归一化该尺寸。18 个首选尺寸对中,有 12 个会得到相同的潜变量网格。其余 6 个——688x1504、800x1328、832x1248 及其横向镜像尺寸——会让参考图的潜变量网格少一行或一列:在 800x1328 时,采样器的网格为 100x166,参考图的网格为 99x165。ComfyUI 自带的 2511 模板也正是这样做的,因此实践中亚块偏移显然没有问题。本页讨论的问题出在尺度,而非取整——1104x1472 的空潜变量在线性尺寸上相差 1.24 倍,而不是只差一行。
因此,在编辑图中,你并不是选择分辨率,而是继承分辨率:
- 正确:
LoadImage->FluxKontextImageScale->(TextEncodeQwenImageEditPlus和VAEEncode)-> KSamplerlatent_image。 - 错误: 使用上表中的尺寸创建
EmptyLatentImage。它的尺寸是固定值;参考图的尺寸则会在工作流运行时根据源图计算。若使用 1104x1472(1.63 MP)的空潜变量,而参考图为 1.05 MP,两者的网格在线性尺寸上相差 1.24 倍,模型无法在两者之间复制细节,因而会重新合成主体——材质会变得像塑料或 CGI,印刷细节也会变成普通形状(#2681)。不会报错;只是生成的图像并不是你要求的编辑结果。
create_workflow (action:"validate") 现在会将这种组合标记为
edit_reference_empty_latent。
提示词模式
编辑指令(自然语言)
"Change the black cat into a cute girl with a black bodysuit and jeans"
"Make the sky a dramatic sunset with orange and purple clouds"
"Add a red sports car parked in front of the house"
"Remove the person on the left and fill with the background"
多角度 LoRA(qwen-image-edit-2511-multiple-angles-lora)
使用 <sks> 词元搭配结构化的角度/距离提示词:
<sks> front view eye-level shot close-up
<sks> front-right quarter view low-angle shot medium shot
<sks> back view elevated shot wide shot
模板:<sks> {direction} view {angle} shot {distance}
方向:正面、右前方四分之三角度、右侧、右后方四分之三角度、背面、左后方四分之三角度、左侧、左前方四分之三角度 角度:低角度、平视、俯视、高角度 距离:特写、中景、远景
负向条件
对 Qwen 编辑始终使用 ConditioningZeroOut 进行负向条件处理:
{
"class_type": "ConditioningZeroOut",
"inputs": { "conditioning": ["<positive_cond_node>", 0] }
}
完整工作流:Lightning 编辑(高级节点)
使用 TextEncodeQwenImageEditPlusAdvance_lrzjason,该节点会直接输出潜变量,因此不需要 EmptyLatentImage。
{
"1": { "class_type": "UNETLoader", "inputs": { "unet_name": "qwen_image_edit_2511_bf16.safetensors", "weight_dtype": "default" }},
"2": { "class_type": "LoraLoaderModelOnly", "inputs": { "model": ["1", 0], "lora_name": "Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors", "strength_model": 1 }},
"3": { "class_type": "CLIPLoader", "inputs": { "clip_name": "qwen_2.5_vl_7b_fp8_scaled.safetensors", "type": "qwen_image" }},
"4": { "class_type": "VAELoader", "inputs": { "vae_name": "qwen_image_vae.safetensors" }},
"5": { "class_type": "LoadImage", "inputs": { "image": "<source_image.png>" }},
"6": { "class_type": "TextEncodeQwenImageEditPlusAdvance_lrzjason", "inputs": {
"clip": ["3", 0], "prompt": "<edit instruction>", "vae": ["4", 0],
"vl_resize_image1": ["5", 0],
"target_size": 1024, "target_vl_size": 384,
"upscale_method": "lanczos", "crop_method": "pad"
}},
"7": { "class_type": "ConditioningZeroOut", "inputs": { "conditioning": ["6", 0] }},
"8": { "class_type": "KSampler", "inputs": {
"model": ["2", 0],
"positive": ["6", 0],
"negative": ["7", 0],
"latent_image": ["6", 1],
"seed": 42, "steps": 4, "cfg": 1, "sampler_name": "euler", "scheduler": "simple", "denoise": 1
}},
"9": { "class_type": "VAEDecode", "inputs": { "samples": ["8", 0], "vae": ["4", 0] }},
"10": { "class_type": "SaveImage", "inputs": { "images": ["9", 0], "filename_prefix": "qwen_edit" }}
}
关键连接:
"latent_image": ["6", 1]:KSampler 直接从高级节点的输出 [1] 获取潜变量"positive": ["6", 0]:来自输出 [0] 的 conditioning_with_full_ref"vl_resize_image1": ["5", 0]:源图输入 VL-resize 插槽(缩小后供视觉编码器使用)
更简单的替代方案(Phr00t v2)
如果无法使用 qweneditutils 自定义节点,请使用内置的 TextEncodeQwenImageEditPlus,并搭配单独的 EmptyLatentImage:
{
"6": { "class_type": "TextEncodeQwenImageEditPlus", "inputs": {
"clip": ["3", 0], "prompt": "<edit instruction>", "vae": ["4", 0], "image1": ["5", 0]
}},
"8": { "class_type": "EmptyLatentImage", "inputs": { "width": 1024, "height": 1024, "batch_size": 1 }}
}
替换节点 6 并添加节点 8。KSampler 的 latent_image 连接到 ["8", 0],而不是 ["6", 1]。
不要让该 EmptyLatentImage 连接到采样器。 上方展示它,只是因为 Plus 编码器自身的接口要求你提供它;但在降噪强度 1.0 的两侧,它会以不同方式出错:
- 低于 1.0 时,它始终会渲染出一片平坦、近乎均匀的区域。编码器只输出 CONDITIONING,因此潜空间确实是空的;而截断的 sigma 调度表是为了保留输入潜空间,但这里的潜空间里什么都没有(#2678)。
- 在 1.0 时,它会渲染出一张看似合理、却不是源图的图像——除非它的宽度和高度恰好与编码器推导出的几何尺寸相同,也就是源图宽高比下约 1.05 MP。对于恰好为正方形的源图,1024x1024 的空潜空间尺寸正好匹配,没有问题。但对于同一张源图,1104x1472 则不匹配:模型会让参考图和输出图共用一个网格,无法在相差如此之大的网格之间复制内容,于是会重新合成(#2681)。参见“编辑工作流中的分辨率”。
第二种情况最容易让人踩坑,因为它取决于你可能都没看过的源图,而且失败时不会给出提示。使用 VAEEncode 就能避免这种巧合——它不可能尺寸错误,因为它是根据编码器看到的同一组像素生成的。
先将图像缩放一次,再把同一张图像的 VAEEncode 输出作为 latent_image 输入,这样两个分支看到的像素及其缩放比例就相同:
{
"5b": { "class_type": "FluxKontextImageScale", "inputs": { "image": ["5", 0] }},
"6": { "class_type": "TextEncodeQwenImageEditPlus", "inputs": {
"clip": ["3", 0], "prompt": "<edit instruction>", "vae": ["4", 0], "image1": ["5b", 0]
}},
"8": { "class_type": "VAEEncode", "inputs": { "pixels": ["5b", 0], "vae": ["4", 0] }}
}
KSampler 的 latent_image 连接到 ["8", 0]。这样,任何降噪强度都有实际意义:1.0 用于完整编辑,低于 1.0 则更接近源图。
基础变体(ComfyUI 官方示例)
官方的“Qwen 2511 Edit Simple”示例使用了较新的内置节点来修补模型和缩放图像:
官方工作流中的附加节点:
ModelSamplingAuraFlow(shift=3.1):应用于 UNET 的流匹配偏移。用于替代ModelSamplingSD3。CFGNorm(strength=1):对 CFG 引导进行归一化,使生成更稳定。应用于ModelSamplingAuraFlow之后。FluxKontextImageScale:将输入图像自动缩放到 Qwen 所需的正确分辨率。无需手动设置尺寸参数。FluxKontextMultiReferenceLatentMethod(method=index_timestep_zero):同时应用于正向和负向 conditioning。用于处理多参考潜空间索引。VAEEncode:将缩放后的图像编码为潜空间(而非使用EmptyLatentImage)。
官方工作流:
UNETLoader → [LoraLoaderModelOnly] → ModelSamplingAuraFlow (shift=3.1) → CFGNorm (strength=1) → MODEL
CLIPLoader (qwen_image) → CLIP
VAELoader → VAE
LoadImage → FluxKontextImageScale → scaled_image
├─ TextEncodeQwenImageEditPlus (positive) → FluxKontextMultiReferenceLatentMethod → positive CONDITIONING
├─ TextEncodeQwenImageEditPlus (negative, empty) → FluxKontextMultiReferenceLatentMethod → negative CONDITIONING
└─ VAEEncode → LATENT
KSampler → VAEDecode → SaveImage
官方采样器设置:
| 变体 | Steps | CFG | 采样器 | 调度器 | 降噪强度 | LoRA |
|---|---|---|---|---|---|---|
| 标准 | 40 | 4.0 | euler | simple | 1.0 | 无 |
| Lightning | 4 | 1.0 | euler | simple | 1.0 | 2511-Lightning-4steps |
注意:直接使用 Comfy 的官方模型文件时,可能不需要 FluxKontextMultiReferenceLatentMethod 和 FluxKontextImageScale 节点;但使用社区重新打包的模型时,可能需要这些节点。
XY Plot 技巧(来自 Widgets.json)
要批量测试多种编辑变体,请使用 Easy Nodes XY Plot 系统:
- Text Multiline 节点用于定义参数列表(例如方向、角度)
- Split String 将其拆分为带索引的选项
- easy textIndexSwitch 每次选择一个选项
- easy promptReplace 替换基础提示词中的
{X}、{Y}、{Z}占位符 - easy XYPlotAdvanced + easy XYInputs: PromptSR 驱动参数遍历
- easy pipeIn 将 model/clip/vae/latent 打包到一个管道中
这会生成一张展示所有组合的网格图,可用于为特定主体找到最佳角度、距离和风格。
显存注意事项
- Qwen 2511 edit bf16:约 10GB 显存
- CLIP (fp8):约 7GB 显存
- VAE:约 200MB
- 总计:约 17-18GB,可轻松运行在 24GB GPU 上
- 如果要从其他模型系列切换,加载前务必执行
clear_vram
提示
- 在构建工作流前,先使用
upload_image (action:"image")上传源图像 - 将输出分辨率与后续管线步骤匹配(例如 WAN FLF 使用 832x480)——但仅适用于生成图。编辑图的尺寸取决于源图;应在之后调整结果的尺寸,而不是按目标尺寸采样
- Lightning LoRA + denoise 1.0 效果良好。模型会通过条件控制保留结构
- 编辑图的
latent_image应取自源图经过VAEEncode编码得到的结果,而不是EmptyLatentImage——在 denoise 小于 1.0 时,空 latent 解码后会变成平坦、近乎均匀的画面(#2678);在 denoise 为 1.0 时,只有当其实际尺寸恰好等于编码器根据源图推导出的几何尺寸时才正确,而这正是VAEEncode能避免的巧合(#2681)。这两种情况都不会报错。create_workflow (action:"validate")会标记这两种配对(partial_denoise_empty_latent、edit_reference_empty_latent) - 对于需要精细控制哪些图像进行 VL 缩放的多图合成,lrzjason Pro variant 最合适
- 使用
get_workflow (action:"analyze"),在修改或执行任何已保存的 Qwen 编辑工作流前先了解它。它会返回结构化摘要,而非原始 JSON。只有在enqueue_workflow或create_workflow (action:"modify")需要实际 JSON 时,才使用get_workflow
来源
- 官方: 未找到。
- 经验: 采样器数值、连线方式和提示词说明来自
packs/中可运行的图以及观察到的渲染结果;并非供应商的提示词指南。