What is inpainting?
inpainting is a technique for "redrawing only a part of an image". However, if you look inside, it can actually be divided into the following two patterns.
- Type A: image2image only the masked part
- Type B: Fill the masked part naturally while looking at the surrounding information
Generally, these are not distinguished, so I often see beginners who are confused because of that. Let's consider them separately for now.
For details on how to create masks and mask editing, please refer to separate pages Mask Operations and AI Mask Generation.
Type A: image2image of only the masked part
This is a method of redrawing only the masked part with the same feeling as normal image2image. It is suitable when you want to change the facial expression a little, change the art style, or correct small details slightly.
workflow
In this workflow, the SetLatentNoiseMask node is used to specify "where to add noise".

{
"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
}
- The base is an image2image workflow.
- 🟥 Convert the original image to latent with the
VAE Encodenode - 🟩 Combine latent and mask with the
Set Latent Noise Masknode
Problems with this method
Let's try setting denoise to 1.00 in the workflow above.

Wow, a horror image was generated (;・∀・)
This method is strictly "image2image using only the masked part as a canvas".
If you raise denoise, it behaves almost like text2image in the masked part.
Since I wrote "red punched perm woman" in the prompt, it started drawing a new woman regardless of the original image.
Is there a way to have the masked part drawn while looking at the overall atmosphere?
Type B: Filling the mask while looking at the surroundings
This type looks at the entire image and "redraws the masked part so that it connects naturally with the surroundings".
Previously, it was just "physically cutting out the application range of image2image with a mask". In this type, the mask area itself is treated as a kind of Conditioning, passing the condition "I want you to redraw only this range" directly to the model.
On top of that, there are various implementation approaches, but for SD1.5, it is enough to keep the following two systems in mind.
- Use an inpainting-dedicated model
- Make a normal model inpaint-compatible with ControlNet inpaint
inpainting Model
Top-notch checkpoint adjusted for the task of "filling while looking at the surroundings" for SD1.5.
Downloading the Model
- stable-diffusion-v1-5/sd-v1-5-inpainting.ckpt
-
📂ComfyUI/ └── 📂models/ └── 📂checkpoints/ └── sd-v1-5-inpainting.ckpt
workflow

{
"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
}
-
🟪 Load the inpainting model.
-
🟩 Replace
VAE EncodeandSet Latent Noise Maskwith theInpaintModelConditioningnode.- The input parameters are almost the same.
-
Only the
noise_maskparameter needs a little attention.true- Forces redrawing only inside the mask, same as with
Set Latent Noise Mask. Usually this setting is fine.
- Forces redrawing only inside the mask, same as with
false- With some models, it may break if set to
true. Tryfalseas a workaround in that case.
- With some models, it may break if set to
In the example above, even if denoise is set to 1.00, you can see that the woman's hair is redrawn so that the whole image looks natural.
Unlike Type A, it behaves like "filling the masked part while checking consistency with the surroundings".
ControlNet inpaint
The disadvantage of inpainting models is that you have to use an inpainting model. There are times when you want to use a model fine-tuned from Stable Diffusion 1.5 for inpainting as is.
At such times, ControlNet inpaint is useful.
ControlNet is explained on another page.
Custom Node
Downloading ControlNet Model
- comfyanonymous/control_v11p_sd15_inpaint_fp16.safetensors
-
📂ComfyUI/ └── 📂models/ └── 📂controlnet/ └── control_v11p_sd15_inpaint_fp16.safetensors
workflow

{
"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
}
- Load your favorite SD1.5 checkpoint (+ LoRA)
- 🟨 Input image and mask to
Inpaint Preprocessorand convert to image for ControlNet- Actually, it just paints the masked part black.
- 🟩 Input ControlNet model, image, and VAE to the
Apply ControlNetnode - 🟥 Incorporate the inpainting using
Set Latent Noise Maskdone above
Connecting to SDXL / Flux etc.
This page specializes in SD1.5, but there are several other inpainting methods.
- Fooocus inpaint (Inpaint model for SDXL)
- Flux.fill (Fill function of Flux family)
- LaInpaint (Image editing / inpaint tool)
These are planned to be covered separately.