Files
scraed-LanPaint/example_workflows/Qwen_Image_Edit_ImageEncode_Inpaint.json
T
scraed 59aa08dff0 Store masks inside exported videos and convert the example set to ImageEncode/ImageDecode
Mask-in-video (the masks now travel with the video file):
- New videometa module: write/read a JSON payload under the lanpaint-mask
  mp4 metadata tag via PyAV (stream copy, movflags=use_metadata_tags), so
  exporting produces a NEW file and the source is never modified.
- Two server routes: GET /lanpaint/video_mask_meta (read the payload back)
  and POST /lanpaint/export_mask_video (remux into input/<base>_masked.mp4).
- The mask editor exports the painted keyframes (base64 PNGs) + audio
  intervals into the video; loading a video with the tag auto-restores the
  masks (editor and node preview). A video without the tag clears the
  workflow's masks - the video is the source of truth. The export also
  offers a native save dialog (showSaveFilePicker) when available.
- The video widget upload now uses video_upload so MP4s are selectable in
  the file chooser (was image_upload).
- LanPaint_ImageEncode accepts 5D latents from video VAEs encoding a single
  image (e.g. the Hunyuan video VAE) - fixes the Hunyuan example.

Example set conversion (one example per supported model, new files, old
pairs removed after being superseded):
- New *ImageEncode/*EncodeDecode example workflows for SDXL, Flux.1,
  Flux.2 Dev, Flux2 Klein, SD3.5, Hunyuan, Ideogram4, Krea2, Qwen Edit,
  Qwen Image, Z-Image, Wan 2.2 and MiniMax H3 (AV), all using
  LanPaint_ImageEncode/ImageDecode instead of VAEEncode +
  SetLatentNoiseMask + VAEDecode + MaskBlend; every example references its
  own example folder's masked input (hash-verified); preview jpgs generated
  from the test runs; the H3 example ships its output mp4 as a preview.
- HiDream example removed on request; Example_29 added with the H3 masked
  input video.

Fixes along the way: normalize node input.link/output.links fields against
the links arrays in all converted workflows (the frontend renders
null-link nodes as disconnected); stale Inpainting_mode widget removed from
the Flux.2 sampler; Lambda defaults 5.0 (first-order scheme); torchaudio
resample test assertion relaxed (edge ringing); the videometa tests updated
to the final export signature.
2026-08-09 20:41:45 +08:00

1174 lines
20 KiB
JSON

{
"id": "91f6bbe2-ed41-4fd6-bac7-71d5b5864ecb",
"revision": 0,
"last_node_id": 149,
"last_link_id": 324,
"nodes": [
{
"id": 99,
"type": "MarkdownNote",
"pos": [
-830,
-10
],
"size": [
540,
550
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [],
"title": "Model links",
"properties": {
"widget_ue_connectable": {}
},
"widgets_values": [
"[Tutorial](https://docs.comfy.org/tutorials/image/qwen/qwen-image-edit) | [教程](https://docs.comfy.org/zh-CN/tutorials/image/qwen/qwen-image-edit)\n\n\n## Model links\n\nYou can find all the models on [Comfy-Org/Qwen-Image_ComfyUI](https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/tree/main) and [Comfy-Org/Qwen-Image-Edit_ComfyUI](https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI) \n\n**Diffusion model**\n\n- [qwen_image_edit_fp8_e4m3fn.safetensors](https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_fp8_e4m3fn.safetensors)\n\n**LoRA**\n\n- [Qwen-Image-Lightning-4steps-V1.0.safetensors](https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V1.0.safetensors)\n\n**Text encoder**\n\n- [qwen_2.5_vl_7b_fp8_scaled.safetensors](https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors)\n\n**VAE**\n\n- [qwen_image_vae.safetensors](https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors)\n\nModel Storage Location\n\n```\n📂 ComfyUI/\n├── 📂 models/\n│ ├── 📂 diffusion_models/\n│ │ └── qwen_image_edit_fp8_e4m3fn.safetensors\n│ ├── 📂 loras/\n│ │ └── Qwen-Image-Lightning-4steps-V1.0.safetensors\n│ ├── 📂 vae/\n│ │ └── qwen_image_vae.safetensors\n│ └── 📂 text_encoders/\n│ └── qwen_2.5_vl_7b_fp8_scaled.safetensors\n```\n"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 129,
"type": "ModelSamplingAuraFlow",
"pos": [
550.1956176757812,
27.127967834472656
],
"size": [
290,
60
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 293
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
260
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.48",
"Node name for S&R": "ModelSamplingAuraFlow",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"widget_ue_connectable": {}
},
"widgets_values": [
3
]
},
{
"id": 130,
"type": "CFGNorm",
"pos": [
550.1956176757812,
137.1279754638672
],
"size": [
290,
60
],
"flags": {},
"order": 13,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 260
}
],
"outputs": [
{
"name": "patched_model",
"type": "MODEL",
"links": [
269
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "CFGNorm",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"strength": true
}
}
},
"widgets_values": [
1
]
},
{
"id": 97,
"type": "MarkdownNote",
"pos": [
960.13525390625,
776.3380737304688
],
"size": [
300,
190
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [],
"title": "KSampler settings",
"properties": {},
"widgets_values": [
"You can test and find the best setting by yourself. The following table is for reference.\n\n| Model | Steps | CFG |\n|---------------------|---------------|---------------|\n| Offical | 50 | 4.0 \n| fp8_e4m3fn | 20 | 2.5 |\n| fp8_e4m3fn + 4steps LoRA | 4 | 1.0 |\n"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 124,
"type": "UNETLoader",
"pos": [
-249.80447387695312,
37.12797164916992
],
"size": [
330,
90
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
292
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.48",
"Node name for S&R": "UNETLoader",
"models": [
{
"name": "qwen_image_edit_fp8_e4m3fn.safetensors",
"url": "https://huggingface.co/Comfy-Org/Qwen-Image-Edit_ComfyUI/resolve/main/split_files/diffusion_models/qwen_image_edit_fp8_e4m3fn.safetensors",
"directory": "diffusion_models"
}
],
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"widget_ue_connectable": {}
},
"widgets_values": [
"qwen_image_edit_fp8_e4m3fn.safetensors",
"default"
]
},
{
"id": 141,
"type": "LoraLoaderModelOnly",
"pos": [
199.41346740722656,
19.401098251342773
],
"size": [
270,
82
],
"flags": {},
"order": 8,
"mode": 4,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 292
}
],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"links": [
293
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "LoraLoaderModelOnly",
"models": [
{
"name": "Qwen-Image-Lightning-4steps-V1.0.safetensors",
"url": "https://huggingface.co/lightx2v/Qwen-Image-Lightning/resolve/main/Qwen-Image-Lightning-4steps-V1.0.safetensors",
"directory": "loras"
}
],
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"lora_name": true,
"strength_model": true
}
}
},
"widgets_values": [
"Qwen-Image-Lightning-4steps-V1.0.safetensors",
1
]
},
{
"id": 125,
"type": "CLIPLoader",
"pos": [
-249.80447387695312,
177.12796020507812
],
"size": [
330,
110
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 0,
"links": [
255,
257
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.48",
"Node name for S&R": "CLIPLoader",
"models": [
{
"name": "qwen_2.5_vl_7b_fp8_scaled.safetensors",
"url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/text_encoders/qwen_2.5_vl_7b_fp8_scaled.safetensors",
"directory": "text_encoders"
}
],
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"widget_ue_connectable": {}
},
"widgets_values": [
"qwen_2.5_vl_7b_fp8_scaled.safetensors",
"qwen_image",
"default"
]
},
{
"id": 104,
"type": "SaveImage",
"pos": [
2063.178955078125,
10.873106002807617
],
"size": [
311.2532653808594,
484.7096252441406
],
"flags": {},
"order": 26,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 324
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.23"
},
"widgets_values": [
"ComfyUI"
]
},
{
"id": 127,
"type": "TextEncodeQwenImageEdit",
"pos": [
182.30767822265625,
198.8886260986328
],
"size": [
360,
150
],
"flags": {},
"order": 18,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 255
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": 256
},
{
"name": "image",
"shape": 7,
"type": "IMAGE",
"link": 306
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
267
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "TextEncodeQwenImageEdit",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"prompt": true
}
}
},
"widgets_values": [
"change the girl's cloth to red evening gown "
],
"color": "#232",
"bgcolor": "#353"
},
{
"id": 128,
"type": "TextEncodeQwenImageEdit",
"pos": [
190.8400421142578,
395.84197998046875
],
"size": [
360,
150
],
"flags": {},
"order": 19,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 257
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": 258
},
{
"name": "image",
"shape": 7,
"type": "IMAGE",
"link": 307
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
268
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "TextEncodeQwenImageEdit",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"prompt": true
}
}
},
"widgets_values": [
""
],
"color": "#223",
"bgcolor": "#335"
},
{
"id": 126,
"type": "VAELoader",
"pos": [
-249.80447387695312,
337.1279296875
],
"size": [
330,
60
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"slot_index": 0,
"links": [
256,
258,
318,
321
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.48",
"Node name for S&R": "VAELoader",
"models": [
{
"name": "qwen_image_vae.safetensors",
"url": "https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors",
"directory": "vae"
}
],
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"widget_ue_connectable": {}
},
"widgets_values": [
"qwen_image_vae.safetensors"
]
},
{
"id": 144,
"type": "ImageScale",
"pos": [
-163.11903381347656,
1055.310546875
],
"size": [
270,
130
],
"flags": {},
"order": 16,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 314
},
{
"name": "width",
"type": "INT",
"widget": {
"name": "width"
},
"link": null
},
{
"name": "height",
"type": "INT",
"widget": {
"name": "height"
},
"link": null
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
306,
307
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.52",
"Node name for S&R": "ImageScale"
},
"widgets_values": [
"nearest-exact",
512,
512,
"center"
]
},
{
"id": 110,
"type": "LoadImage",
"pos": [
-224.69882202148438,
491.67425537109375
],
"size": [
274.080078125,
314.0000305175781
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
275,
314,
316,
322
]
},
{
"name": "MASK",
"type": "MASK",
"links": [
275,
314,
316,
322
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "LoadImage",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"image": true,
"upload": true
}
}
},
"widgets_values": [
"Masked_Load_Me_in_Loader (9).png",
"image"
]
},
{
"id": 96,
"type": "MarkdownNote",
"pos": [
-548.3401489257812,
1051.436279296875
],
"size": [
280,
88
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [],
"outputs": [],
"properties": {},
"widgets_values": [
"This node is to avoid poor output results caused by excessively large input image sizes."
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 140,
"type": "MarkdownNote",
"pos": [
1361.85009765625,
360.32342529296875
],
"size": [
300,
190
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [],
"outputs": [],
"title": "KSampler settings",
"properties": {},
"widgets_values": [
"Decrease **LanPaint_NumSteps** for faster generation. \n"
],
"color": "#432",
"bgcolor": "#653"
},
{
"id": 131,
"type": "ImageScaleToTotalPixels",
"pos": [
-851.1531982421875,
1230.9898681640625
],
"size": [
270,
82
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 275
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": []
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.50",
"Node name for S&R": "ImageScaleToTotalPixels",
"enableTabs": false,
"tabWidth": 65,
"tabXOffset": 10,
"hasSecondTab": false,
"secondTabText": "Send Back",
"secondTabOffset": 80,
"secondTabWidth": 65,
"ue_properties": {
"widget_ue_connectable": {
"upscale_method": true,
"megapixels": true
}
}
},
"widgets_values": [
"nearest-exact",
1
]
},
{
"id": 102,
"type": "LanPaint_KSampler",
"pos": [
935.6971435546875,
22.220111846923828
],
"size": [
400,
572
],
"flags": {},
"order": 23,
"mode": 0,
"inputs": [
{
"name": "model",
"type": "MODEL",
"link": 269
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 267
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 268
},
{
"name": "latent_image",
"type": "LATENT",
"link": 319
}
],
"outputs": [
{
"name": "LATENT",
"type": "LATENT",
"links": [
320
]
}
],
"properties": {
"cnr_id": "LanPaint",
"ver": "453b6c090e400123bb82f5bc0c97854031b09274",
"Node name for S&R": "LanPaint_KSampler"
},
"widgets_values": [
0,
"fixed",
20,
2.5,
"euler",
"simple",
1,
5,
"Image First",
"LanPaint KSampler. For more info, visit https://github.com/scraed/LanPaint. If you find it useful, please give a star ⭐️!"
]
},
{
"id": 148,
"type": "LanPaint_ImageEncode",
"pos": [
4480,
2000
],
"size": [
270,
110
],
"flags": {},
"order": 50,
"mode": 0,
"inputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 316
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 318
},
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"link": 317
}
],
"outputs": [
{
"localized_name": "latent",
"name": "latent",
"type": "LATENT",
"links": [
319
]
}
],
"properties": {
"Node name for S&R": "LanPaint_ImageEncode",
"cnr_id": "LanPaint"
},
"widgets_values": []
},
{
"id": 149,
"type": "LanPaint_ImageDecode",
"pos": [
4790,
2000
],
"size": [
270,
150
],
"flags": {},
"order": 51,
"mode": 0,
"inputs": [
{
"localized_name": "samples",
"name": "samples",
"type": "LATENT",
"link": 320
},
{
"localized_name": "vae",
"name": "vae",
"type": "VAE",
"link": 321
},
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"link": 322
},
{
"localized_name": "mask",
"name": "mask",
"type": "MASK",
"link": 323
},
{
"localized_name": "blend_overlap",
"name": "blend_overlap",
"type": "INT",
"widget": {
"name": "blend_overlap"
},
"link": null
}
],
"outputs": [
{
"localized_name": "image",
"name": "image",
"type": "IMAGE",
"links": [
324
]
}
],
"properties": {
"Node name for S&R": "LanPaint_ImageDecode",
"cnr_id": "LanPaint"
},
"widgets_values": [
9
]
}
],
"links": [
[
255,
125,
0,
127,
0,
"CLIP"
],
[
256,
126,
0,
127,
1,
"VAE"
],
[
257,
125,
0,
128,
0,
"CLIP"
],
[
258,
126,
0,
128,
1,
"VAE"
],
[
260,
129,
0,
130,
0,
"MODEL"
],
[
267,
127,
0,
102,
1,
"CONDITIONING"
],
[
268,
128,
0,
102,
2,
"CONDITIONING"
],
[
269,
130,
0,
102,
0,
"MODEL"
],
[
275,
110,
0,
131,
0,
"IMAGE"
],
[
292,
124,
0,
141,
0,
"MODEL"
],
[
293,
141,
0,
129,
0,
"MODEL"
],
[
306,
144,
0,
127,
2,
"IMAGE"
],
[
307,
144,
0,
128,
2,
"IMAGE"
],
[
314,
110,
0,
144,
0,
"IMAGE"
],
[
316,
110,
0,
148,
0,
"IMAGE"
],
[
317,
110,
1,
148,
2,
"MASK"
],
[
318,
126,
0,
148,
1,
"VAE"
],
[
319,
148,
0,
102,
3,
"LATENT"
],
[
320,
102,
0,
149,
0,
"LATENT"
],
[
321,
126,
0,
149,
1,
"VAE"
],
[
322,
110,
0,
149,
2,
"IMAGE"
],
[
323,
110,
1,
149,
3,
"MASK"
],
[
324,
149,
0,
104,
0,
"IMAGE"
]
],
"groups": [
{
"id": 1,
"title": "Step1 - Load models",
"bounding": [
-270,
-40,
370,
450
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 2,
"title": "Step 2 - Upload image for editing",
"bounding": [
-270,
430,
370,
400
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
},
{
"id": 3,
"title": "Step 3 - Prompt",
"bounding": [
130,
130,
380,
433.6000061035156
],
"color": "#3f789e",
"font_size": 24,
"flags": {}
}
],
"config": {},
"extra": {
"ds": {
"scale": 0.8770472573513671,
"offset": [
-1288.739882247765,
215.50013247190662
]
},
"frontendVersion": "1.25.10",
"ue_links": [],
"links_added_by_ue": [],
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true,
"groupNodes": {}
},
"version": 0.4
}