Skip to content
🧠 模型×任务工作流第 8 / 16 节

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.safetensors22.17 GBmodels/diffusion_models/Hugging Face · ModelScope 镜像
clip_l.safetensors234.7 MBmodels/text_encoders/Hugging Face
t5xxl_fp16.safetensors9.12 GBmodels/text_encoders/Hugging Face
ae.safetensors319.8 MBmodels/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 画蒙版 ​

  1. 右键 Load Image 节点,选 Open in MaskEditor
  2. 右侧面板调画笔粗细,在要改的区域上涂抹;画错了用橡皮擦掉
  3. 点 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)装 VAEae.safetensors
CLIPTextEncode编码正向提示词描述「蒙版里要出现什么」
FluxGuidanceFLUX 专属引导强度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 / bottom400 / 0 / 400 / 400四边各扩多少像素(按 8 的倍数步进);模板是往左、右、下各扩 400,上边不动
feathering24羽化:新区与原图的过渡平滑度,越大越平滑

它输出两样东西:撑大后的画布(新增区域填中性灰)+ 自动生成的蒙版(新增区域 = 重绘区)。后面的链路和第 4 步一样:InpaintModelConditioning → KSampler → VAEDecode。

上传你自己的图,按需改四边数值——想把竖图扩成横图,就把 left/right 调大、top/bottom 保持 0。提示词描述新增区域要出现什么(模板示例是 beautiful scenery)。

💡 这个模板的 noise_mask 是关的

扩图模板把 InpaintModelConditioning 的 noise_mask 设为 false:整张新画布都参与去噪,Fill 模型参照拼接进条件的原图,把未扩区域重建得和原来一致,再按提示词补全灰色新区。模型链上的 DifferentialDiffusion 此时没有动态蒙版可调,留着不影响运行。

按 Ctrl+Enter 运行。

你应该看到:画布按四边参数变大,新增区域和原画面自然衔接,原图内容保持一致。

  • 扩图跑通:画布变大了,衔接处没有硬边

第 6 步:迭代与组合——重绘扩图串着用(可选) ​

为什么:真实的修图任务往往一轮不够、一次一种——迭代和组合才是 Fill 的完全体。

操作:

  1. 迭代重绘:第一轮结果不满意?右键 Save Image → Copy(Clipspace),右键 Load Image → Paste(Clipspace),把输出变成输入,再画一块新蒙版继续改(官方基础教程也建议:对生成结果反复重绘,直到满意)
  2. 先扩图、再重绘:扩出来的区域有瑕疵?切回重绘模板,把瑕疵圈进蒙版单独修——大范围交给扩图,细节交给重绘
  3. 电商向玩法:商品图扩出干净的展示背景、去掉背景里的杂物,再配合抠图换背景和商品样机组成完整流程

你应该看到:多轮下来图越来越接近想要的效果,而且每轮只动该动的区域。

  • (可选)用 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 两格照官方文档步骤清单选 ​

text
❌ 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)
VAEae.safetensors(319.8 MB)放 models/vae/;与 FLUX.1 文生图通用
DualCLIPLoader第一格 clip_l、第二格 t5xxl、type fluxFLUX 家族配方;官方文档步骤清单写反了,以模板为准
KSampler20 步、cfg 1、euler、normal、denoise 1.0两个官方模板同款配置
FluxGuidance30官方模板默认
InpaintModelConditioning重绘 noise_mask true / 扩图 false圈外保持 vs 整布重建
Pad Image for Outpaintingleft 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 商品样机工作流:把设计稿贴上实物
搞懂AI关于我们怎么写隐私说明

独立的第三方教程,与文中提到的任何产品及其公司没有隶属或合作关系;产品名称和商标归各自所有者。价格和政策以官方页面为准。