什么是 inpainting?
inpainting 是一种 “只重绘图像的一部分” 的方法。
删除不需要的内容、只重绘一部分、替换成其他内容…… 细分起来有很多用途,实现这些用途的方法也不止一种。
只对局部应用 image2image
普通的 image2image 会重新生成整张图像。如果用掩膜限制生成范围,就能只重新生成其中一部分。
工作流
基础是平时使用的 image2image 工作流。在此基础上加入掩膜,指定需要重绘的位置。

{
"id": "8b9f7796-0873-4025-be3c-0f997f67f866",
"revision": 0,
"last_node_id": 17,
"last_link_id": 20,
"nodes": [
{
"id": 10,
"type": "VAELoader",
"pos": [
150.35849892963756,
608.4685752753562
],
"size": [
231.48760330578511,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
10,
13
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"vae-ft-mse-840000-ema-pruned.safetensors"
]
},
{
"id": 12,
"type": "VAEEncode",
"pos": [
427.11516235234546,
674.510187570697
],
"size": [
140,
46
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "pixels",
"type": "IMAGE",
"link": 11
},
{
"name": "vae",
"type": "VAE",
"link": 13
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
14
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "VAEEncode"
},
"color": "#322",
"bgcolor": "#533"
},
{
"id": 7,
"type": "CLIPTextEncode",
"pos": [
416.1970166015625,
392.37848510742185
],
"size": [
410.75801513671877,
158.82607910156253
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 5
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
6
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, watermark, worst quality"
]
},
{
"id": 9,
"type": "SaveImage",
"pos": [
1451,
189
],
"size": [
503.2876035004722,
576.239673217884
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 9
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1209,
188
],
"size": [
203.39999999999986,
46
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 7
},
{
"name": "vae",
"type": "VAE",
"link": 10
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
9
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
39.900463636363625,
349.9095500000008
],
"size": [
315,
98
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
1
]
},
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 1,
"links": [
3,
5
]
},
{
"name": "VAE",
"type": "VAE",
"slot_index": 2,
"links": []
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"v1-5-pruned-emaonly-fp16.safetensors"
]
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
415,
186
],
"size": [
411.95503173828126,
151.0030493164063
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 3
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
4
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"high quality, RAW photo of a woman with red hair, Punch perm"
]
},
{
"id": 11,
"type": "LoadImage",
"pos": [
39.85257865587715,
722.7009982393679
],
"size": [
341.9935235795455,
473.93255454545454
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
11
]
},
{
"name": "MASK",
"type": "MASK",
"links": [
15
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "LoadImage",
"image": "clipspace/clipspace-painted-masked-1765071052914.png [input]"
},
"widgets_values": [
"clipspace/clipspace-painted-masked-1765071052914.png [input]",
"image"
]
},
{
"id": 3,
"type": "KSampler",
"pos": [
863,
186
],
"size": [
315,
262
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 1
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 4
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 6
},
{
"name": "latent_image",
"type": "LATENT",
"link": 16
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
7
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "KSampler"
},
"widgets_values": [
45678,
"fixed",
20,
8,
"euler",
"normal",
0.8
]
},
{
"id": 13,
"type": "SetLatentNoiseMask",
"pos": [
607.2212780548256,
721.4635076308024
],
"size": [
208.02038352272726,
46
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 14
},
{
"name": "mask",
"type": "MASK",
"link": 15
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
16
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "SetLatentNoiseMask"
},
"color": "#232",
"bgcolor": "#353"
}
],
"links": [
[
1,
4,
0,
3,
0,
"MODEL"
],
[
3,
4,
1,
6,
0,
"CLIP"
],
[
4,
6,
0,
3,
1,
"CONDITIONING"
],
[
5,
4,
1,
7,
0,
"CLIP"
],
[
6,
7,
0,
3,
2,
"CONDITIONING"
],
[
7,
3,
0,
8,
0,
"LATENT"
],
[
9,
8,
0,
9,
0,
"IMAGE"
],
[
10,
10,
0,
8,
1,
"VAE"
],
[
11,
11,
0,
12,
0,
"IMAGE"
],
[
13,
10,
0,
12,
1,
"VAE"
],
[
14,
12,
0,
13,
0,
"LATENT"
],
[
15,
11,
1,
13,
1,
"MASK"
],
[
16,
13,
0,
3,
3,
"LATENT"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.620921323059155,
"offset": [
332.32361134412287,
153.96599000000006
]
},
"frontendVersion": "1.34.6",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
- 🟥 使用
VAE Encode节点将原图转换为 latent - 🟩 使用
Set Latent Noise Mask节点组合 latent 和掩膜
Set Latent Noise Mask 用来指定 KSampler 可以重绘的范围。
在内部,每个 step 都会先对整张图像执行 image2image,再将掩膜外恢复为原图的 latent。
最终看起来,就像只对掩膜部分执行了 image2image。
关于掩膜的制作和编辑方法,请参阅掩膜操作和使用 AI 生成掩膜。
【问题】提高 denoise 后会和周围不协调
它的基本性质与普通 image2image 相同。
denoise 越高,自由度越大,但也会逐渐忘记原图。
试着将上面工作流中的 denoise 设为 1.00。

如果对整张图像执行 image2image,即使变化很大,也可以有它自己的乐趣。
但是,局部 image2image 会保留掩膜外的原图。这样一来,掩膜内外可能失去一致性。
如果只是稍微改变花朵的形状,这种方法也没问题。但较大的变化就比较困难。
要把红花变成蓝色,或把花替换成乐器,就需要提高 denoise。可一旦提高,编辑部分又可能和周围格格不入……
那么,这种时候该怎么办呢?🤔
inpainting 专用模型
一种答案是使用 inpainting 专用模型。
在前面的方法中,掩膜只用来把 image2image 限制在局部。模型本身并不知道哪里被掩膜了。
inpainting 模型还会接收到“要重绘哪里”和“该区域外有什么内容”。
它会生成一张用灰色遮住掩膜区域的图像,再将其传给模型。这样模型看不到重绘前的内容,只能根据周围信息来填补该区域。
下载模型
📂ComfyUI/
└── 📂models/
└── 📂checkpoints/
└── sd-v1-5-inpainting.ckpt
工作流

{
"id": "8b9f7796-0873-4025-be3c-0f997f67f866",
"revision": 0,
"last_node_id": 21,
"last_link_id": 30,
"nodes": [
{
"id": 9,
"type": "SaveImage",
"pos": [
1773.2999999999997,
213.20000000000002
],
"size": [
503.2876035004722,
576.239673217884
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 9
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1531.2999999999997,
212.20000000000002
],
"size": [
203.39999999999986,
46
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 7
},
{
"name": "vae",
"type": "VAE",
"link": 10
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
9
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
415,
186
],
"size": [
411.95503173828126,
151.0030493164063
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 3
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
25
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"high quality, RAW photo of a woman with red hair, Punch perm"
]
},
{
"id": 7,
"type": "CLIPTextEncode",
"pos": [
416.1970166015625,
392.37848510742185
],
"size": [
410.75801513671877,
158.82607910156253
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 5
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
26
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, watermark, worst quality"
]
},
{
"id": 11,
"type": "LoadImage",
"pos": [
479.08257865587706,
719.0709982393678
],
"size": [
341.9935235795455,
473.93255454545454
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
29
]
},
{
"name": "MASK",
"type": "MASK",
"links": [
30
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "LoadImage",
"image": "clipspace/clipspace-painted-masked-1765071052914.png [input]"
},
"widgets_values": [
"clipspace/clipspace-painted-masked-1765071052914.png [input]",
"image"
]
},
{
"id": 10,
"type": "VAELoader",
"pos": [
589.5884989296375,
604.8385752753561
],
"size": [
231.48760330578511,
58
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
10,
27
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"vae-ft-mse-840000-ema-pruned.safetensors"
]
},
{
"id": 3,
"type": "KSampler",
"pos": [
1185.2999999999995,
210.20000000000002
],
"size": [
315,
262
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 1
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 23
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 24
},
{
"name": "latent_image",
"type": "LATENT",
"link": 28
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
7
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "KSampler"
},
"widgets_values": [
45678,
"fixed",
20,
8,
"euler",
"normal",
1
]
},
{
"id": 20,
"type": "InpaintModelConditioning",
"pos": [
885.5197492645148,
229.90120706804433
],
"size": [
258.49395533092,
138
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "positive",
"type": "CONDITIONING",
"link": 25
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 26
},
{
"name": "vae",
"type": "VAE",
"link": 27
},
{
"name": "pixels",
"type": "IMAGE",
"link": 29
},
{
"name": "mask",
"type": "MASK",
"link": 30
}
],
"outputs": [
{
"name": "positive",
"type": "CONDITIONING",
"links": [
23
]
},
{
"name": "negative",
"type": "CONDITIONING",
"links": [
24
]
},
{
"name": "latent",
"type": "LATENT",
"links": [
28
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "InpaintModelConditioning"
},
"widgets_values": [
true
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
39.900463636363625,
349.9095500000008
],
"size": [
315,
98
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
1
]
},
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 1,
"links": [
3,
5
]
},
{
"name": "VAE",
"type": "VAE",
"slot_index": 2,
"links": []
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"sd-v1-5-inpainting.ckpt"
],
"color": "#323",
"bgcolor": "#535"
}
],
"links": [
[
1,
4,
0,
3,
0,
"MODEL"
],
[
3,
4,
1,
6,
0,
"CLIP"
],
[
5,
4,
1,
7,
0,
"CLIP"
],
[
7,
3,
0,
8,
0,
"LATENT"
],
[
9,
8,
0,
9,
0,
"IMAGE"
],
[
10,
10,
0,
8,
1,
"VAE"
],
[
23,
20,
0,
3,
1,
"CONDITIONING"
],
[
24,
20,
1,
3,
2,
"CONDITIONING"
],
[
25,
6,
0,
20,
0,
"CONDITIONING"
],
[
26,
7,
0,
20,
1,
"CONDITIONING"
],
[
27,
10,
0,
20,
2,
"VAE"
],
[
28,
20,
2,
3,
3,
"LATENT"
],
[
29,
11,
0,
20,
3,
"IMAGE"
],
[
30,
11,
1,
20,
4,
"MASK"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.6830134553650705,
"offset": [
58.63543636363637,
-84.5359
]
},
"frontendVersion": "1.34.6",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
- 🟪 加载 inpainting 模型。
- 🟩 将
VAE Encode、Set Latent Noise Mask替换为InpaintModelConditioning节点。
InpaintModelConditioning 有两个作用。
- 与
Set Latent Noise Mask相同,只对局部执行 image2image - 将掩膜和用灰色遮住掩膜区域的原图传给模型
noise_mask 用来决定是否启用第一个作用。
true- 与
Set Latent Noise Mask相同,只对掩膜部分执行 image2image。 - 通常使用这个设置即可。
- 与
false- 模型仍会接收到掩膜和用灰色遮住掩膜区域的原图,但 image2image 会重绘整张图像,而不只重绘掩膜部分。
- 极少数模型在
true时会出现异常,遇到这种情况可以试试这个设置。
上面的工作流将 denoise 设为 1.00,但并没有生成另一个女性,而是根据周围内容重新绘制了她的头发。
这说明模型知道该编辑哪里,也知道绘制时该参考什么。
ControlNet inpaint
让模型知道掩膜范围的方法,并不只有 inpainting 专用模型。
其中一种就是 ControlNet inpaint。
关于 ControlNet,将在其他页面中说明。
自定义节点
下载 ControlNet 模型
- comfyanonymous/control_v11p_sd15_inpaint_fp16.safetensors
-
📂ComfyUI/ └── 📂models/ └── 📂controlnet/ └── control_v11p_sd15_inpaint_fp16.safetensors
工作流

{
"id": "8b9f7796-0873-4025-be3c-0f997f67f866",
"revision": 0,
"last_node_id": 30,
"last_link_id": 53,
"nodes": [
{
"id": 9,
"type": "SaveImage",
"pos": [
1757.2999999999997,
214.20000000000002
],
"size": [
503.2876035004722,
576.239673217884
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 9
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1515.2999999999997,
213.20000000000002
],
"size": [
203.39999999999986,
46
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 7
},
{
"name": "vae",
"type": "VAE",
"link": 10
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
9
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "VAEDecode"
},
"widgets_values": []
},
{
"id": 7,
"type": "CLIPTextEncode",
"pos": [
420.98808709870343,
387.97848510742176
],
"size": [
410.75801513671877,
158.82607910156253
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 5
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
33
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"text, watermark, worst quality"
]
},
{
"id": 22,
"type": "ControlNetApplyAdvanced",
"pos": [
901.0437048084135,
232.48767017280198
],
"size": [
235.54470323065357,
186
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "positive",
"type": "CONDITIONING",
"link": 32
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 33
},
{
"name": "control_net",
"type": "CONTROL_NET",
"link": 39
},
{
"name": "image",
"type": "IMAGE",
"link": 31
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": 34
}
],
"outputs": [
{
"name": "positive",
"type": "CONDITIONING",
"links": [
37
]
},
{
"name": "negative",
"type": "CONDITIONING",
"links": [
38
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "ControlNetApplyAdvanced"
},
"widgets_values": [
0.8,
0,
1
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
419.79107049714094,
181.60000000000002
],
"size": [
411.95503173828126,
151.0030493164063
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 3
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
32
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CLIPTextEncode"
},
"widgets_values": [
"high quality, RAW photo of a woman with red hair, Punch perm"
]
},
{
"id": 26,
"type": "ControlNetLoader",
"pos": [
573.8122179379016,
601.5646590492796
],
"size": [
257.93388429752065,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CONTROL_NET",
"type": "CONTROL_NET",
"links": [
39
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "ControlNetLoader"
},
"widgets_values": [
"control_v11p_sd15_inpaint_fp16.safetensors"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 24,
"type": "InpaintPreprocessor",
"pos": [
593.6777428604222,
728.2127272727273
],
"size": [
238.068359375,
78
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 35
},
{
"name": "mask",
"type": "MASK",
"link": 36
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
31
]
}
],
"properties": {
"cnr_id": "comfyui_controlnet_aux",
"ver": "12f35647f0d510e03b45a47fb420fe1245a575df",
"Node name for S&R": "InpaintPreprocessor"
},
"widgets_values": [
false
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 3,
"type": "KSampler",
"pos": [
1169.2999999999995,
211.20000000000002
],
"size": [
315,
262
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 1
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 37
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 38
},
{
"name": "latent_image",
"type": "LATENT",
"link": 53
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
7
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "KSampler"
},
"widgets_values": [
12345,
"fixed",
20,
8,
"euler",
"normal",
1
]
},
{
"id": 10,
"type": "VAELoader",
"pos": [
395.1303171114555,
1012.947966184447
],
"size": [
231.48760330578511,
58
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
10,
34,
41
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "VAELoader"
},
"widgets_values": [
"vae-ft-mse-840000-ema-pruned.safetensors"
]
},
{
"id": 27,
"type": "VAEEncode",
"pos": [
486.7770161500693,
868.15734837917
],
"size": [
140,
46
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "pixels",
"type": "IMAGE",
"link": 43
},
{
"name": "vae",
"type": "VAE",
"link": 41
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
51
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "VAEEncode"
},
"color": "#322",
"bgcolor": "#533"
},
{
"id": 30,
"type": "SetLatentNoiseMask",
"pos": [
654.6523241448506,
916.4969147623518
],
"size": [
180.74765625,
46
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 51
},
{
"name": "mask",
"type": "MASK",
"link": 52
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
53
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "SetLatentNoiseMask"
},
"color": "#322",
"bgcolor": "#533"
},
{
"id": 11,
"type": "LoadImage",
"pos": [
17.462760474058893,
915.0939090909087
],
"size": [
341.9935235795455,
473.93255454545454
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
35,
43
]
},
{
"name": "MASK",
"type": "MASK",
"links": [
36,
52
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.76",
"Node name for S&R": "LoadImage",
"image": "clipspace/clipspace-painted-masked-1765071052914.png [input]"
},
"widgets_values": [
"clipspace/clipspace-painted-masked-1765071052914.png [input]",
"image"
]
},
{
"id": 4,
"type": "CheckpointLoaderSimple",
"pos": [
59.95686363636362,
333.7249500000008
],
"size": [
315,
98
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
1
]
},
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 1,
"links": [
3,
5
]
},
{
"name": "VAE",
"type": "VAE",
"slot_index": 2,
"links": []
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.33",
"Node name for S&R": "CheckpointLoaderSimple"
},
"widgets_values": [
"v1-5-pruned-emaonly-fp16.safetensors"
]
}
],
"links": [
[
1,
4,
0,
3,
0,
"MODEL"
],
[
3,
4,
1,
6,
0,
"CLIP"
],
[
5,
4,
1,
7,
0,
"CLIP"
],
[
7,
3,
0,
8,
0,
"LATENT"
],
[
9,
8,
0,
9,
0,
"IMAGE"
],
[
10,
10,
0,
8,
1,
"VAE"
],
[
31,
24,
0,
22,
3,
"IMAGE"
],
[
32,
6,
0,
22,
0,
"CONDITIONING"
],
[
33,
7,
0,
22,
1,
"CONDITIONING"
],
[
34,
10,
0,
22,
4,
"VAE"
],
[
35,
11,
0,
24,
0,
"IMAGE"
],
[
36,
11,
1,
24,
1,
"MASK"
],
[
37,
22,
0,
3,
1,
"CONDITIONING"
],
[
38,
22,
1,
3,
2,
"CONDITIONING"
],
[
39,
26,
0,
22,
2,
"CONTROL_NET"
],
[
41,
10,
0,
27,
1,
"VAE"
],
[
43,
11,
0,
27,
0,
"IMAGE"
],
[
51,
27,
0,
30,
0,
"LATENT"
],
[
52,
11,
1,
30,
1,
"MASK"
],
[
53,
30,
0,
3,
3,
"LATENT"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.683013455365071,
"offset": [
82.5372395259411,
-81.60000000000002
]
},
"frontendVersion": "1.34.6",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
- 加载任意 SD1.5 checkpoint(+LoRA)
- 🟨 将图像和掩膜输入
Inpaint Preprocessor,转换为 ControlNet 使用的图像- 从外观上看,掩膜区域被涂成了黑色。
- 🟩 将 ControlNet 模型、图像和 VAE 输入
Apply ControlNet节点 - 🟥 使用
Set Latent Noise Mask,将重绘范围限制在掩膜区域
虽然使用的技术不同,但所做的事情和 inpainting 模型相同:将“需要填补的位置”和“周围有什么内容”传给模型。
其他 inpainting 方法
这里不作介绍,但 Stable Diffusion 1.5 之后的模型还有其他各种方法。
- Fooocus Inpaint
- FLUX.1 Fill
- etc.
图像编辑模型
如今,要介绍这个主题就不能不提图像编辑模型。
图像编辑模型可以按照“删除男性的帽子”这样的提示词指定对象,也可以输入一张用红线圈出区域的图像,并给出“在这里添加一只猫”的指示。甚至不需要专用的掩膜。
严格来说,它们通常不会放在 inpainting 的语境中讨论。不过,如果从能够改变图像的一部分这一点来看,能做到的事情是一样的。
FLUX.2 [klein]
作为一个有代表性的图像编辑模型,我们来看看 FLUX.2 [klein]。

{
"id": "e47d064a-cb92-4da7-b92b-be9f1ddd26f5",
"revision": 0,
"last_node_id": 55,
"last_link_id": 86,
"nodes": [
{
"id": 45,
"type": "SaveImage",
"pos": [
1813.4632685986182,
160.40068341159756
],
"size": [
582.6799999999998,
614.729
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 65
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.73"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 6,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
160.40068341159756
],
"size": [
425.2650317382812,
167.9430462646484
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 63
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
70
]
}
],
"title": "CLIP Text Encode (Positive Prompt)",
"properties": {
"Node name for S&R": "CLIPTextEncode",
"cnr_id": "comfy-core",
"ver": "0.3.39"
},
"widgets_values": [
"remove the man\n"
]
},
{
"id": 8,
"type": "VAEDecode",
"pos": [
1615.039087801503,
160.40068341159756
],
"size": [
161.111083984375,
46
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "samples",
"type": "LATENT",
"link": 52
},
{
"name": "vae",
"type": "VAE",
"link": 62
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
65
]
}
],
"properties": {
"Node name for S&R": "VAEDecode",
"cnr_id": "comfy-core",
"ver": "0.3.39"
},
"widgets_values": []
},
{
"id": 51,
"type": "ResizeImageMaskNode",
"pos": [
209.97616959564456,
484.74016932307575
],
"size": [
270,
106
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "input",
"type": "IMAGE,MASK",
"link": 72
}
],
"outputs": [
{
"name": "resized",
"type": "IMAGE",
"links": [
82
]
}
],
"properties": {
"Node name for S&R": "ResizeImageMaskNode",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [
"scale total pixels",
1,
"nearest-exact"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 49,
"type": "ReferenceLatent",
"pos": [
1021.2781285510225,
160.40068341159756
],
"size": [
204.134765625,
46
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "conditioning",
"type": "CONDITIONING",
"link": 70
},
{
"name": "latent",
"shape": 7,
"type": "LATENT",
"link": 75
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
71
]
}
],
"properties": {
"Node name for S&R": "ReferenceLatent",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 44,
"type": "CLIPLoader",
"pos": [
224.49879211425772,
292.66704483032197
],
"size": [
283.80000000000007,
106
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"links": [
63,
64
]
}
],
"properties": {
"Node name for S&R": "CLIPLoader",
"cnr_id": "comfy-core",
"ver": "0.3.73"
},
"widgets_values": [
"qwen_3_8b.safetensors",
"flux2",
"default"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 50,
"type": "LoadImage",
"pos": [
-121.29607870133319,
484.74016932307575
],
"size": [
296.798828125,
458.0000000000001
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
72
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [
"pexels-photo-31438166.jpg",
"image"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 43,
"type": "VAELoader",
"pos": [
517.231573621917,
656.7863480776692
],
"size": [
269.8313103058076,
58
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"links": [
62,
76
]
}
],
"properties": {
"Node name for S&R": "VAELoader",
"cnr_id": "comfy-core",
"ver": "0.3.39"
},
"widgets_values": [
"flux2-vae.safetensors"
],
"color": "#322",
"bgcolor": "#533"
},
{
"id": 48,
"type": "UNETLoader",
"pos": [
917.2536154382312,
19.495025634765582
],
"size": [
308.1592787377913,
82
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
69
]
}
],
"properties": {
"Node name for S&R": "UNETLoader",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [
"Flux.2\\flux-2-klein-9b-fp8.safetensors",
"default"
],
"color": "#323",
"bgcolor": "#535"
},
{
"id": 54,
"type": "ResizeImageMaskNode",
"pos": [
514.4495897676222,
484.74016932307575
],
"size": [
270,
106
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "input",
"type": "IMAGE,MASK",
"link": 82
}
],
"outputs": [
{
"name": "resized",
"type": "IMAGE",
"links": [
80
]
}
],
"properties": {
"Node name for S&R": "ResizeImageMaskNode",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [
"scale to multiple",
16,
"nearest-exact"
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 52,
"type": "VAEEncode",
"pos": [
821.9650317382822,
484.74016932307575
],
"size": [
162,
46
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "pixels",
"type": "IMAGE",
"link": 80
},
{
"name": "vae",
"type": "VAE",
"link": 76
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
74,
75
]
}
],
"properties": {
"Node name for S&R": "VAEEncode",
"cnr_id": "comfy-core",
"ver": "0.9.2"
},
"widgets_values": [],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 31,
"type": "KSampler",
"pos": [
1262.7259909887628,
160.40068341159756
],
"size": [
315,
262
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 69
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 71
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 86
},
{
"name": "latent_image",
"type": "LATENT",
"link": 74
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
52
]
}
],
"properties": {
"Node name for S&R": "KSampler",
"cnr_id": "comfy-core",
"ver": "0.3.39"
},
"widgets_values": [
1234,
"fixed",
4,
1,
"euler",
"simple",
1
]
},
{
"id": 33,
"type": "CLIPTextEncode",
"pos": [
558.700000000001,
387.24938745307793
],
"size": [
425.2650317382812,
122.99611236572264
],
"flags": {
"collapsed": true
},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 64
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
86
]
}
],
"title": "CLIP Text Encode (Negative Prompt)",
"properties": {
"Node name for S&R": "CLIPTextEncode",
"cnr_id": "comfy-core",
"ver": "0.3.39"
},
"widgets_values": [
""
]
}
],
"links": [
[
52,
31,
0,
8,
0,
"LATENT"
],
[
62,
43,
0,
8,
1,
"VAE"
],
[
63,
44,
0,
6,
0,
"CLIP"
],
[
64,
44,
0,
33,
0,
"CLIP"
],
[
65,
8,
0,
45,
0,
"IMAGE"
],
[
69,
48,
0,
31,
0,
"MODEL"
],
[
70,
6,
0,
49,
0,
"CONDITIONING"
],
[
71,
49,
0,
31,
1,
"CONDITIONING"
],
[
72,
50,
0,
51,
0,
"IMAGE"
],
[
74,
52,
0,
31,
3,
"LATENT"
],
[
75,
52,
0,
49,
1,
"LATENT"
],
[
76,
43,
0,
52,
1,
"VAE"
],
[
80,
54,
0,
52,
0,
"IMAGE"
],
[
82,
51,
0,
54,
0,
"IMAGE"
],
[
86,
33,
0,
31,
2,
"CONDITIONING"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.7422431483303209,
"offset": [
-76.59967753672073,
692.7631798199931
]
},
"frontendVersion": "1.38.8",
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
这个工作流只需要输入图像和 remove the man 提示词,就能从图像中删除男性。