FLUX.1 Fill:局部重绘与扩图
FLUX.1 Fill 是 Black Forest Labs FLUX.1 Tools 套件里专攻图像补全的模型:给它一张图加一块蒙版,它只补全蒙版圈住的部分,圈外像素原样保留。官方称其重绘与扩图效果仅次于商业版 FLUX.1 Fill [pro]。
这一页带你用官方模板跑通两种操作:局部重绘(inpaint)——蒙版圈哪改哪,修穿帮、换局部;扩图(outpaint)——把画面边界向外延伸,方图变横图。这也是 ComfyUI 局部重绘的标准做法之一:圈定范围、精确施工、圈外不动。
学完你能做什么
- 跑通官方 FLUX.1 Fill 工作流:模板加载 → 四件套归位 → 蒙版重绘出图
- 用蒙版做局部重绘:圈哪改哪,圈外像素一个不动
- 用 Pad Image for Outpainting 扩图:四边参数控制扩展方向,方图扩成横图
- 读懂重绘专用节点 InpaintModelConditioning:图和蒙版在哪汇合、noise_mask 开关管什么
- 记住 Fill 铁律:cfg 1、20 步、euler/normal、guidance 30
你现在的困境
- 一张图 95% 都满意,就一个角落穿帮——重新生成,另外 95% 全变样
- 用图生图硬改:重绘幅度调大全图跑偏,调小了那一块根本改不动
- 想把竖图扩成横图做封面,直接拉伸变形,裁剪又把主体裁没了
什么时候用这一招
当你需要:
- 只改画面的一小块:去掉路人、修掉多余的手指、给人物换一件衣服
- 扩大画布:把场景向外延伸、方图扩横图、补足构图留白
- 圈外内容严格保持原样——蒙版之外像素级不动
而且不想:
- 为了一小块瑕疵整图重新抽卡
- 用一句话指令改整图——那是上一课 Kontext 的活儿,它按指令理解着改,不承诺圈外像素一动不动
🎒 开始前的准备
- 跑通了FLUX.1 文生图:四件套目录规则、cfg 1 这些 FLUX 家族共识都在那一课
- 会加载模板、上传图片、按
Ctrl+Enter运行(忘了回看第一次生图) - 硬盘预留约 31.8GB:扩散模型 22.17GB + t5xxl_fp16 9.12GB + clip_l 234.7MB + VAE 319.8MB(装过 FLUX.1 全量版文生图的直接复用后三个,只需新下扩散模型)
- ComfyUI 更新到较新版本:局部重绘模板用了子图功能,模板库元数据要求 0.3.42 以上,模板便签也提醒先更新 ComfyUI
- 网络能连 Hugging Face;连不稳就走 ModelScope 国内镜像(第 2 步给地址)
- 准备一张要修的图——人像、产品图、插画都行;想跟官方示例对齐,就下载官方重绘示例图(自带蒙版)或官方扩图示例图
- 一杯水 ☕——22GB 的模型下载是本课最大的等待
核心思路
局部重绘解决的是「为一小块瑕疵整图重抽」的痛点。 官方基础教程的比喻很形象:画面整体满意但个别元素出错,重新生成会得到一张完全不同的图——所以让画师(模型)只重画你圈出来的那块。FLUX.1 Fill 是照着这个任务专门训练的:输入 = 蒙版外的原图 + 蒙版,输出 = 补全后的完整图。官方基础教程还点破了扩图的本质:扩图其实就是一个重绘工作流,只是换了节点来构建蒙版。
三种改图方式摆在一起看:
| 方式 | 改动范围 | 圈外像素 | 典型场景 |
|---|---|---|---|
| 重新生成 / 图生图 | 整图 | 不保证 | 重抽构图、换风格 |
| Kontext(上一课) | 按指令改,整图范围理解 | 高度一致,但不承诺像素级不变 | 一句话换背景、换装 |
| FLUX.1 Fill(本课) | 蒙版圈内 | 严格保持,一个不动 | 精确修一角、扩画布 |
图和蒙版在哪汇合? 看局部重绘模板的数据流(提示词与模型链略,第 4 步逐节点讲):
Load Image ─┬→ IMAGE ─→ InpaintModelConditioning ─┬→ positive ──┐
└→ MASK ──→ (原图+蒙版编码进条件) ├→ negative ──┼→ KSampler ─→ VAEDecode ─→ Save Image
└→ latent ────┘ ↑
CLIPTextEncode(正向提示词)─→ FluxGuidance ───────────────────────────┤
UNETLoader(flux1-fill-dev)─→ DifferentialDiffusion ─────────────────┘核心是 InpaintModelConditioning:它把「蒙版外的原图 + 蒙版」编码成 FLUX.1 Fill 训练时就认识的输入格式挂进条件,同时把原图编码成起始 latent。它还有一个 noise_mask 开关(节点源码的说明:给 latent 加噪声蒙版,让采样只发生在蒙版内;效果因模型而异):
| noise_mask | 采样范围 | 用在 |
|---|---|---|
true(重绘模板) | 只采蒙版内,圈外像素原样 | 局部重绘 |
false(扩图模板) | 整张新画布参与去噪 | 扩图——Fill 参照原图保持未扩区域一致,补全灰色新区 |
跟传统 SD 重绘的区别:基础重绘教程用的是 VAE Encode (for Inpainting) 节点(靠 grow_mask_by 扩边);FLUX.1 Fill 这类重绘专用模型改用 InpaintModelConditioning,把蒙版后的图直接喂给按此训练的模型——这也是它圈外保持得更稳的原因。
跟我做
第 1 步:加载官方 FLUX.1 Fill 工作流模板
为什么:官方模板把参数、模型下载链接、示例图都配好了,你只需要换图和提示词就能跑。
操作:左侧栏 Templates 打开模板库,搜 Flux.1,选「Flux.1 图像修复」(模板 ID flux_fill_inpaint_example;官方文档给的搜索词是 "Flux.1 Inpaint")。本课先跑它,扩图模板第 5 步再换。不想用模板库,就下载 JSON 再用菜单 Workflows → Open(Ctrl+O)打开:flux_fill_inpaint_example.json。模板库的完整玩法见模板库。
你应该看到:画布是一个紧凑的三节点结构——Load Image(引用官方示例图 flux_fill_inpaint_example_input_image.png)→ 一个名为 Flux.1 Fill Dev Image Inpainting 的子图节点 → Save Image。子图节点表面直接暴露 image、mask、prompt、seed 和四个模型文件下拉框;旁边一张便签写满模型下载链接。注意 Load Image 的 IMAGE 和 MASK 两根线都连进了子图——MASK 就是你圈出来的施工范围。
- 模板加载成功,能看到子图节点和模型链接便签
第 2 步:下载 Fill 四件套并归位
为什么:Fill 是独立训练的重绘模型,和文生图的 flux1-dev、指令编辑的 flux1-dev-kontext 是三个互不通用的文件;四个文件各归其位,loader 的下拉列表才找得到。
操作:从 Hugging Face 下载四个文件(模板便签附了全部链接):
| 文件 | 大小 | 放进哪个子目录 | 下载 |
|---|---|---|---|
flux1-fill-dev.safetensors | 22.17 GB | models/diffusion_models/ | Hugging Face · ModelScope 镜像 |
clip_l.safetensors | 234.7 MB | models/text_encoders/ | Hugging Face |
t5xxl_fp16.safetensors | 9.12 GB | models/text_encoders/ | Hugging Face |
ae.safetensors | 319.8 MB | models/vae/ | Hugging Face · ModelScope 镜像 |
目录结构长这样:
ComfyUI/
├── models/
│ ├── diffusion_models/
│ │ └── flux1-fill-dev.safetensors
│ ├── text_encoders/
│ │ ├── clip_l.safetensors
│ │ └── t5xxl_fp16.safetensors
│ └── vae/
│ └── ae.safetensors💡 上一课的文件能复用吗?
clip_l、t5xxl_fp16、ae 三个文件与 FLUX.1 文生图全量版通用——官方教程明说:跑过文生图全量版,只需新下 flux1-fill-dev.safetensors。但注意它和 flux1-dev.safetensors(文生图)、flux1-dev-kontext_fp8_scaled.safetensors(Kontext)是三个不同的权重,互不通用。国内下载走 ModelScope 镜像(上表已附)。
⚠️ 原版权重要同意协议
官方教程提醒:下载 Black Forest Labs 原版 flux1-fill-dev 需先在 black-forest-labs/FLUX.1-Fill-dev 页面同意使用协议。模板内置链接(上表)是 Comfy-Org 重新打包版,模板缺模型自动下载走的就是它。模型按 FLUX.1 [dev] Non-Commercial License 授权(非商用),官方教程称生成产出可用于个人、科研与商业用途,具体以许可文本为准。
放好后画布上按 r 刷新,子图的四个下拉框选中对应文件(或打开子图,在里面的 loader 节点里选)。
你应该看到:红色缺失警告全部消失,下拉框显示正确的文件名。
- 四个文件各归其位,子图上的模型下拉框都选中了文件
第 3 步:画蒙版,圈定要重绘的范围
为什么:Fill 只补全蒙版圈住的部分——蒙版就是施工范围,圈得准,改得就准。
操作:
方式 A:用官方示例图,自带蒙版(推荐先跑通)
官方重绘示例图 flux_fill_inpaint_example_input_image.png 已带 alpha 透明蒙版,上传进 Load Image 就能用,不用画。想练习自己画,官方另给了去掉蒙版的原图。
方式 B:自己的图,用 MaskEditor 画蒙版
- 右键 Load Image 节点,选 Open in MaskEditor
- 右侧面板调画笔粗细,在要改的区域上涂抹;画错了用橡皮擦掉
- 点 Save 保存——画过的内容自动变成 Load Image 的 MASK 输出
💡 把生成图直接变成输入图
右键 Save Image 节点选 Copy(Clipspace),再右键 Load Image 选 Paste(Clipspace)——上一轮的输出不用落盘再上传,直接变成这一轮的输入。多轮修图时特别顺手(第 6 步会用到)。
你应该看到:Load Image 的 MASK 输出连着线进子图;蒙版里白色(画过)的区域 = 即将重绘的区域。
- Load Image 里有了图和蒙版,MASK 输出连线正常
第 4 步:跑出第一张 ComfyUI 局部重绘图
为什么:知道图、蒙版、提示词在哪汇合,后面调参排错才有方向;这一步跑通,ComfyUI 局部重绘的主干你就掌握了。
操作:双击子图节点进入内部,逐节点对照这张表:
| 节点 | 干什么 | 模板里的关键参数 |
|---|---|---|
| UNETLoader(Load Diffusion Model) | 装 Fill 扩散模型 | flux1-fill-dev.safetensors |
| DualCLIPLoader | 一次装两个文本编码器 | 第一格 clip_l.safetensors,第二格 t5xxl_fp16.safetensors,type flux |
| VAELoader(Load VAE) | 装 VAE | ae.safetensors |
| CLIPTextEncode | 编码正向提示词 | 描述「蒙版里要出现什么」 |
| FluxGuidance | FLUX 专属引导强度 | 30 |
| ConditioningZeroOut | 负向条件置零 | cfg 1,不需要负向提示词 |
| DifferentialDiffusion | 动态去噪蒙版(实验性节点) | 让蒙版外像素在采样收尾阶段参与极轻去噪,衔接更自然 |
| InpaintModelConditioning | 核心:把原图 + 蒙版编码进条件 | noise_mask true:只采蒙版内 |
| KSampler | 去噪采样 | 20 步、cfg 1、euler、normal、denoise 1.0 |
| VAEDecode → SaveImage | 解码并保存 | 文件前缀 ComfyUI,落 ComfyUI/output/ |
提示词写法:描述蒙版里要出现的内容。补全缺失(官方示例的用法)就描述完整画面——模板自带示例 anime girl with massive fennec ears blonde hair blue eyes wearing a pink shirt;换掉某个物体就重点写新物体长什么样。
⚠️ DualCLIPLoader 两格别选反
官方教程的步骤清单把两格写成了 clip_name1: t5xxl、clip_name2: clip_l——但模板 JSON 和节点源码里的 FLUX 配方都是第一格 clip_l、第二格 t5xxl(源码描述原文:flux: clip-l, t5)。照模板选就行,别照文档步骤清单选。
点 Run(旧界面叫 Queue),或按 Ctrl+Enter。
你应该看到:进度条走满 20 步,SaveImage 出图——蒙版内的内容按提示词补全,蒙版外和原图一模一样。
- 第一张局部重绘图出炉:圈内变了,圈外没动
第 5 步:扩图——把画面边界向外延伸
为什么:扩图 = 自动构建蒙版的重绘(官方基础教程原话:这其实就是一个重绘工作流,只是换了节点来构建蒙版)。画布不够大、构图太满,都靠它向外要地。
操作:回到模板库,选「Flux.1 外绘」(模板 ID flux_fill_outpaint_example;官方文档给的搜索词是 "Flux.1 Outpaint"),或直接下载 flux_fill_outpaint_example.json。模型四件套和第 2 步完全相同,不用再下。ComfyUI 扩图(outpaint)的主干就是这一个模板。
这个模板是平铺结构,多了一个关键节点 Pad Image for Outpainting:
| 参数 | 模板默认值 | 说明 |
|---|---|---|
left / top / right / bottom | 400 / 0 / 400 / 400 | 四边各扩多少像素(按 8 的倍数步进);模板是往左、右、下各扩 400,上边不动 |
feathering | 24 | 羽化:新区与原图的过渡平滑度,越大越平滑 |
它输出两样东西:撑大后的画布(新增区域填中性灰)+ 自动生成的蒙版(新增区域 = 重绘区)。后面的链路和第 4 步一样:InpaintModelConditioning → KSampler → VAEDecode。
上传你自己的图,按需改四边数值——想把竖图扩成横图,就把 left/right 调大、top/bottom 保持 0。提示词描述新增区域要出现什么(模板示例是 beautiful scenery)。
💡 这个模板的 noise_mask 是关的
扩图模板把 InpaintModelConditioning 的 noise_mask 设为 false:整张新画布都参与去噪,Fill 模型参照拼接进条件的原图,把未扩区域重建得和原来一致,再按提示词补全灰色新区。模型链上的 DifferentialDiffusion 此时没有动态蒙版可调,留着不影响运行。
按 Ctrl+Enter 运行。
你应该看到:画布按四边参数变大,新增区域和原画面自然衔接,原图内容保持一致。
- 扩图跑通:画布变大了,衔接处没有硬边
第 6 步:迭代与组合——重绘扩图串着用(可选)
为什么:真实的修图任务往往一轮不够、一次一种——迭代和组合才是 Fill 的完全体。
操作:
- 迭代重绘:第一轮结果不满意?右键 Save Image → Copy(Clipspace),右键 Load Image → Paste(Clipspace),把输出变成输入,再画一块新蒙版继续改(官方基础教程也建议:对生成结果反复重绘,直到满意)
- 先扩图、再重绘:扩出来的区域有瑕疵?切回重绘模板,把瑕疵圈进蒙版单独修——大范围交给扩图,细节交给重绘
- 电商向玩法:商品图扩出干净的展示背景、去掉背景里的杂物,再配合抠图换背景和商品样机组成完整流程
你应该看到:多轮下来图越来越接近想要的效果,而且每轮只动该动的区域。
- (可选)用 Clipspace 迭代了一轮,或把重绘和扩图串起来用了一次
检查点 ✅
- 局部重绘跑通:官方示例图或自己的图 + 蒙版,圈内补全、圈外不动
- 扩图跑通:Pad Image for Outpainting 四边参数控制扩展方向
- 说得出 InpaintModelConditioning 的作用:把原图 + 蒙版编码进 Fill 模型的条件
- 记住铁律:cfg 1、20 步、
euler/normal、guidance 30、无需负向提示词 - (可选)用 Clipspace 迭代重绘,或重绘 + 扩图组合出了一张图
踩坑提醒
❌ 扩图把 feathering 调成 0
原因:feathering 的参数语义是「新区与原图的过渡平滑度,越大越平滑」,官方模板默认 24。归零等于放弃过渡,衔接处容易生硬。正确做法:保留默认值或适当调大;四边数值记得按 8 的倍数改(节点步进就是 8)。
❌ 认真写了负向提示词
原因:模板里负向条件由 ConditioningZeroOut 直接置零,KSampler 的 cfg 又是 1——负向提示词写了也完全不参与。这是 FLUX 家族共识(文生图课讲过)。正确做法:把描述的力气全花在正向提示词上。
❌ 拿 flux1-dev 或 kontext 的权重当 Fill 用
原因:flux1-dev(文生图)、flux1-dev-kontext(指令编辑)、flux1-fill-dev(重绘扩图)是三个独立训练的权重,互不通用;选错文件轻则效果不对,重则架构不匹配直接报错。正确做法:按第 2 步表格下载 flux1-fill-dev.safetensors 归位;找不到文件就看模型加载失败。
❌ DualCLIPLoader 两格照官方文档步骤清单选
❌ clip_name1: t5xxl_fp16.safetensors clip_name2: clip_l.safetensors (文档步骤清单的写法)
✅ clip_name1: clip_l.safetensors clip_name2: t5xxl_fp16.safetensors(模板 JSON 与节点源码配方的写法)原因:官方 fill 教程的运行步骤清单把两格写反了;模板 JSON 的实际取值和节点源码里的 FLUX 配方(flux: clip-l, t5)都是第一格 clip_l、第二格 t5xxl。正确做法:照模板选,type 选 flux。
进阶技巧(可选)
🔧 显存吃紧的两个正规操作:Fill 官方只提供 22.17GB 的全量权重(与文生图 flux1-dev 同为 12B 全量版,没有 fp8 单文件版)。显存不够时:一是在 UNETLoader 的高级选项 weight_dtype 里选 fp8_e4m3fn 量化加载(节点自带选项);二是把 t5xxl_fp16.safetensors(9.12GB)换成 t5xxl_fp8_e4m3fn_scaled.safetensors(4.8GB,Kontext 课用的就是它)。还不行就看显存不足的系统解法。
🔧 重绘边缘有硬痕:把蒙版画大一点,把要改的物体整个圈进去(而不是只圈中间),给模型留足过渡空间——这和基础重绘教程里 grow_mask_by 扩边是同一个思路;仍有残留就再跑一轮小范围重绘修边。
🔧 修图路线怎么选:圈定范围的局部重绘、扩图用本课 Fill;整图范围的指令式编辑用 Kontext;想用中文指令修图,看 Qwen-Image-Edit 和 Qwen-Image-2.1;商品场景的完整链路见电商图实战。
本课小结
✅ ComfyUI 局部重绘跑通了:官方模板 → 四件套归位 → MaskEditor 画蒙版 → 20 步出图,圈内补全、圈外不动。
✅ 扩图跑通了:Pad Image for Outpainting 按四边参数撑大画布、自动生成蒙版,本质是「自动建蒙版的重绘」。
✅ 重绘专用节点会看了:InpaintModelConditioning 把原图 + 蒙版编码进 Fill 的条件;noise_mask 开 = 只采蒙版内(重绘),关 = 整张画布参与去噪(扩图)。
✅ 迭代与组合会串了:Clipspace 把输出变输入;先扩图再重绘,大范围和小细节分工。
关键配置回顾:
| 配置 | 推荐值 | 说明 |
|---|---|---|
| 扩散模型 | flux1-fill-dev.safetensors(22.17 GB) | 放 models/diffusion_models/;与 flux1-dev / kontext 互不通用 |
| 文本编码器 | clip_l.safetensors + t5xxl_fp16.safetensors(9.12 GB) | 放 models/text_encoders/;显存吃紧可换 t5xxl fp8 版(4.8 GB) |
| VAE | ae.safetensors(319.8 MB) | 放 models/vae/;与 FLUX.1 文生图通用 |
| DualCLIPLoader | 第一格 clip_l、第二格 t5xxl、type flux | FLUX 家族配方;官方文档步骤清单写反了,以模板为准 |
| KSampler | 20 步、cfg 1、euler、normal、denoise 1.0 | 两个官方模板同款配置 |
| FluxGuidance | 30 | 官方模板默认 |
| InpaintModelConditioning | 重绘 noise_mask true / 扩图 false | 圈外保持 vs 整布重建 |
| Pad Image for Outpainting | left 400 / top 0 / right 400 / bottom 400 / feathering 24 | 模板默认:左、右、下各扩 400 像素 |
下一课预告
Fill 把「圈哪改哪」做到了像素级;下一课的 FLUX.2 把「参照」玩到新高度——一次参考多张图保持一致性。下一课:FLUX.2:Dev 多参照一致性与 Klein 轻量版。
你会学到:
- FLUX.2 Dev 的多参照一致性:最多 10 张参考图一起参考
- hex 品牌色精确控制与专业文字渲染
- Klein 轻量版:8.4GB 显存级跑 FLUX.2
- Product Mockup 商品样机工作流:把设计稿贴上实物