Files
scraed-LanPaint/example_workflows/Transparent_Edit_EncodeDecode_Inpaint.json
T
scraed 391ca9625f Trim the Qwen 2.1 section to a paragraph
The section explained the VAE's channel count, the autogrow mismatch and the mask-size
measurements before saying where the example was. Keep what a reader needs: the model is
supported, transparency is inpainted too, and here is how to point it at your own picture.
The workflow's own note gets the same treatment.
2026-09-28 00:31:59 +08:00

976 lines
15 KiB
JSON

{
"id": "c4e8a1f7-2b93-4d6e-8a50-1f7e9c3b6d28",
"revision": 0,
"last_node_id": 14,
"last_link_id": 19,
"nodes": [
{
"id": 1,
"type": "UNETLoader",
"pos": [
-1180,
40
],
"size": [
390,
82
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "MODEL",
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
1
]
}
],
"properties": {
"Node name for S&R": "UNETLoader",
"cnr_id": "comfy-core"
},
"widgets_values": [
"qwen_image_2.1_int8_convrot.safetensors",
"default"
]
},
{
"id": 2,
"type": "CLIPLoader",
"pos": [
-1180,
170
],
"size": [
390,
106
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "CLIP",
"name": "CLIP",
"type": "CLIP",
"slot_index": 0,
"links": [
3,
4
]
}
],
"properties": {
"Node name for S&R": "CLIPLoader",
"cnr_id": "comfy-core"
},
"widgets_values": [
"qwen3vl_8b_int8_convrot.safetensors",
"qwen_image",
"default"
]
},
{
"id": 3,
"type": "VAELoader",
"pos": [
-1180,
320
],
"size": [
390,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "VAE",
"name": "VAE",
"type": "VAE",
"slot_index": 0,
"links": [
5,
6,
7
]
}
],
"properties": {
"Node name for S&R": "VAELoader",
"cnr_id": "comfy-core"
},
"widgets_values": [
"qwen_image_2.1_vae_bf16.safetensors"
]
},
{
"id": 4,
"type": "QwenImage21Cache",
"pos": [
-740,
40
],
"size": [
310,
82
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"localized_name": "model",
"name": "model",
"type": "MODEL",
"link": 1
}
],
"outputs": [
{
"localized_name": "MODEL",
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
2
]
}
],
"properties": {
"Node name for S&R": "QwenImage21Cache",
"cnr_id": "comfy-core"
},
"widgets_values": [
"auto",
"default"
]
},
{
"id": 5,
"type": "LoadImage",
"pos": [
-1180,
420
],
"size": [
390,
440
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
8
]
},
{
"localized_name": "MASK",
"name": "MASK",
"type": "MASK",
"slot_index": 1,
"links": [
9
]
}
],
"properties": {
"Node name for S&R": "LoadImage",
"cnr_id": "comfy-core"
},
"widgets_values": [
"Image_Load_Me_in_Loader.png",
"image"
],
"title": "The picture (RGBA: the alpha is the background)"
},
{
"id": 6,
"type": "JoinImageWithAlpha",
"pos": [
-740,
420
],
"size": [
330,
60
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 8
},
{
"localized_name": "alpha",
"name": "alpha",
"type": "MASK",
"link": 9
}
],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
10,
11,
12
]
}
],
"properties": {
"Node name for S&R": "JoinImageWithAlpha",
"cnr_id": "comfy-core"
},
"widgets_values": [],
"title": "Re-attach the alpha as the 4th channel"
},
{
"id": 7,
"type": "LoadImageMask",
"pos": [
-1180,
900
],
"size": [
390,
480
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [
{
"localized_name": "MASK",
"name": "MASK",
"type": "MASK",
"slot_index": 0,
"links": [
13,
14
]
}
],
"properties": {
"Node name for S&R": "LoadImageMask",
"cnr_id": "comfy-core"
},
"widgets_values": [
"Mask_Load_Me_in_Loader.png",
"red"
],
"title": "The mask, on its own (white = rebuild)"
},
{
"id": 8,
"type": "TextEncodeQwenImageEditPlus",
"pos": [
-740,
520
],
"size": [
440,
250
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"localized_name": "clip",
"name": "clip",
"type": "CLIP",
"link": 3
},
{
"localized_name": "prompt",
"name": "prompt",
"type": "STRING",
"link": null,
"widget": {
"name": "prompt"
}
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 5
},
{
"localized_name": "image1",
"name": "image1",
"type": "IMAGE",
"link": 10
},
{
"localized_name": "image2",
"name": "image2",
"type": "IMAGE",
"link": null
},
{
"localized_name": "image3",
"name": "image3",
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"localized_name": "CONDITIONING",
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
15
]
}
],
"properties": {
"Node name for S&R": "TextEncodeQwenImageEditPlus",
"cnr_id": "comfy-core"
},
"widgets_values": [
"the boot's sole and forefoot replaced by a sleek futuristic mechanical unit: segmented brushed titanium plating with fine panel lines, glowing cyan energy strips along the flanks, a sculpted dark carbon-fibre heel block, precise engineered details and tiny bolts, the brown leather upper above stays exactly as it is, high-end sci-fi product photography, transparent background"
],
"title": "Text Encode Qwen Image Edit Plus (reference + prompt)",
"color": "#232",
"bgcolor": "#353"
},
{
"id": 9,
"type": "CLIPTextEncode",
"pos": [
-740,
800
],
"size": [
440,
150
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"localized_name": "clip",
"name": "clip",
"type": "CLIP",
"link": 4
},
{
"localized_name": "text",
"name": "text",
"type": "STRING",
"link": null,
"widget": {
"name": "text"
}
}
],
"outputs": [
{
"localized_name": "CONDITIONING",
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
16
]
}
],
"properties": {
"Node name for S&R": "CLIPTextEncode",
"cnr_id": "comfy-core"
},
"widgets_values": [
"低分辨率,低画质,肢体畸形,手指畸形,画面过饱和,蜡像感,人脸无细节,过度光滑,画面具有AI感,模糊,变形"
],
"title": "CLIP Text Encode (Negative Prompt)",
"color": "#223",
"bgcolor": "#335"
},
{
"id": 10,
"type": "LanPaint_ImageEncode",
"pos": [
-240,
40
],
"size": [
300,
110
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 11
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 6
},
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"link": 13
}
],
"outputs": [
{
"localized_name": "LATENT",
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
17
]
}
],
"properties": {
"Node name for S&R": "LanPaint_ImageEncode",
"cnr_id": "comfy-core"
},
"widgets_values": []
},
{
"id": 11,
"type": "LanPaint_KSampler",
"pos": [
-240,
190
],
"size": [
330,
320
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"localized_name": "model",
"name": "model",
"type": "MODEL",
"link": 2
},
{
"localized_name": "positive",
"name": "positive",
"type": "CONDITIONING",
"link": 15
},
{
"localized_name": "negative",
"name": "negative",
"type": "CONDITIONING",
"link": 16
},
{
"localized_name": "latent_image",
"name": "latent_image",
"type": "LATENT",
"link": 17
},
{
"localized_name": "seed",
"name": "seed",
"type": "INT",
"link": null,
"widget": {
"name": "seed"
}
},
{
"localized_name": "steps",
"name": "steps",
"type": "INT",
"link": null,
"widget": {
"name": "steps"
}
},
{
"localized_name": "cfg",
"name": "cfg",
"type": "FLOAT",
"link": null,
"widget": {
"name": "cfg"
}
},
{
"localized_name": "sampler_name",
"name": "sampler_name",
"type": "COMBO",
"link": null,
"widget": {
"name": "sampler_name"
}
},
{
"localized_name": "scheduler",
"name": "scheduler",
"type": "COMBO",
"link": null,
"widget": {
"name": "scheduler"
}
},
{
"localized_name": "denoise",
"name": "denoise",
"type": "FLOAT",
"link": null,
"widget": {
"name": "denoise"
}
},
{
"localized_name": "LanPaint_NumSteps",
"name": "LanPaint_NumSteps",
"type": "INT",
"link": null,
"widget": {
"name": "LanPaint_NumSteps"
}
},
{
"localized_name": "LanPaint_PromptMode",
"name": "LanPaint_PromptMode",
"type": "COMBO",
"link": null,
"widget": {
"name": "LanPaint_PromptMode"
}
},
{
"localized_name": "LanPaint_Info",
"name": "LanPaint_Info",
"type": "STRING",
"link": null,
"widget": {
"name": "LanPaint_Info"
}
},
{
"localized_name": "Inpainting_mode",
"name": "Inpainting_mode",
"type": "COMBO",
"link": null,
"widget": {
"name": "Inpainting_mode"
}
}
],
"outputs": [
{
"localized_name": "LATENT",
"name": "LATENT",
"type": "LATENT",
"slot_index": 0,
"links": [
18
]
}
],
"properties": {
"Node name for S&R": "LanPaint_KSampler",
"cnr_id": "comfy-core"
},
"widgets_values": [
777,
"fixed",
20,
4.0,
"euler",
"simple",
1.0,
5,
"Image First",
"LanPaint KSampler. For more info, visit https://github.com/scraed/LanPaint. If you find it useful, please give a star ⭐!",
"🖼️ Image Inpainting",
"lanpaint_star_button"
]
},
{
"id": 12,
"type": "LanPaint_ImageDecode",
"pos": [
180,
40
],
"size": [
300,
120
],
"flags": {},
"order": 12,
"mode": 0,
"inputs": [
{
"localized_name": "samples",
"name": "samples",
"type": "LATENT",
"link": 18
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 7
},
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 12
},
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"link": 14
},
{
"localized_name": "blend_overlap",
"name": "blend_overlap",
"type": "INT",
"link": null,
"widget": {
"name": "blend_overlap"
}
}
],
"outputs": [
{
"localized_name": "IMAGE",
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
19
]
}
],
"properties": {
"Node name for S&R": "LanPaint_ImageDecode",
"cnr_id": "comfy-core"
},
"widgets_values": [
9
],
"title": "Decode and merge (keeps RGBA)"
},
{
"id": 13,
"type": "SaveImage",
"pos": [
180,
220
],
"size": [
400,
420
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"localized_name": "images",
"name": "images",
"type": "IMAGE",
"link": 19
}
],
"outputs": [],
"properties": {
"Node name for S&R": "SaveImage",
"cnr_id": "comfy-core"
},
"widgets_values": [
"Qwen2.1_Transparent_Edit"
]
},
{
"id": 14,
"type": "MarkdownNote",
"pos": [
-1180,
1420
],
"size": [
900,
640
],
"flags": {},
"order": 14,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {
"Node name for S&R": "MarkdownNote",
"cnr_id": "comfy-core"
},
"widgets_values": [
"## Qwen-Image 2.1 + LanPaint, inpainting a picture with transparency\n\nThe source is RGBA and the edit is allowed to change the alpha, so the rebuilt sole gets\na new silhouette instead of just new pixels.\n\n`Join Image With Alpha` re-attaches the picture's alpha - `Load Image` hands it out on its\n`MASK` output rather than keeping it on the image. That mask is `1 - alpha` (1 =\ntransparent), which is what `Join Image With Alpha` wants, so it connects with no invert.\n\nThe mask is a separate greyscale file, white = repaint, and it is kept modest here (about\n16% of the frame). LanPaint anchors everything outside the mask to the original on every\nstep, so a mask covering most of the picture leaves the model without context."
],
"title": "How this works (and the mask size trap)",
"color": "#432",
"bgcolor": "#653"
}
],
"links": [
[
1,
1,
0,
4,
0,
"MODEL"
],
[
2,
4,
0,
11,
0,
"MODEL"
],
[
3,
2,
0,
8,
0,
"CLIP"
],
[
4,
2,
0,
9,
0,
"CLIP"
],
[
5,
3,
0,
8,
2,
"VAE"
],
[
6,
3,
0,
10,
1,
"VAE"
],
[
7,
3,
0,
12,
1,
"VAE"
],
[
8,
5,
0,
6,
0,
"IMAGE"
],
[
9,
5,
1,
6,
1,
"MASK"
],
[
10,
6,
0,
8,
3,
"IMAGE"
],
[
11,
6,
0,
10,
0,
"IMAGE"
],
[
12,
6,
0,
12,
2,
"IMAGE"
],
[
13,
7,
0,
10,
2,
"MASK"
],
[
14,
7,
0,
12,
3,
"MASK"
],
[
15,
8,
0,
11,
1,
"CONDITIONING"
],
[
16,
9,
0,
11,
2,
"CONDITIONING"
],
[
17,
10,
0,
11,
3,
"LATENT"
],
[
18,
11,
0,
12,
0,
"LATENT"
],
[
19,
12,
0,
13,
0,
"IMAGE"
]
],
"groups": [
{
"id": 1,
"title": "Step 1 - Load models",
"bounding": [
-1190,
0,
420,
400
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "Step 2 - Picture + its alpha + the mask",
"bounding": [
-1190,
380,
880,
1020
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "Step 3 - Texts",
"bounding": [
-750,
490,
460,
480
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 4,
"title": "Step 4 - LanPaint: encode, sample, decode",
"bounding": [
-250,
0,
840,
520
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.55,
"offset": [
1210,
180
]
},
"workflowRendererVersion": "LG"
},
"version": 0.4
}