commit before push

a commit before pushing to cloud, not really restarting yet, but need some assets for the outpaint node project
This commit is contained in:
Beak
2026-02-11 09:32:30 -08:00
parent e58b8f37b6
commit 0c3f0e2129
13 changed files with 11157 additions and 1114 deletions
+483
View File
@@ -0,0 +1,483 @@
-> Using workflow data from: ControlNet_00010_upscale.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: controlnet_i2i_tableLady_00004_.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: disc_fix_00006_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
8 VAELoader
vae_name: ae.safetensors
17 CLIPTextEncode
9 DualCLIPLoader
clip_name1: clip_l.safetensors
clip_name2: t5xxl_fp16.safetensors
type: flux
device: default
5 CLIPTextEncode
text: she was beautiful when she was young, long hair, large chest, cute eyes, puffy lips, but spent her life in hostess bars and nightclubs. now she is thirty and as she looks into the camera her face tells the story of her wild youth, She is wearing revealing bright yellow swimwear, a gold necklace hangs just above ample cleavage. Sitting next to her is her younger friend, cuter and busty, shorter hair and a tighter bright green bikini, she has a naughty wicked smile.
6 FluxGuidance
guidance: 25.0
10 InpaintModelConditioning
7 UNETLoader
unet_name: flux1-fill-dev.safetensors
weight_dtype: default
11 DifferentialDiffusion
1 KSampler
seed: 506728175275987
steps: 30
cfg: 1.0
sampler_name: euler
scheduler: beta
denoise: 1.0
param1: randomize
2 VAEDecode
20 LoadImage
image: clipspace/clipspace-mask-16580118.299999999.png [input]
upload: image
4 LoadImage
image: clipspace/clipspace-mask-3930874.8000000003.png [input]
upload: image
15 InpaintExtendOutpaint
12 InpaintCrop
context_expand_pixels: 20
context_expand_factor: 1.0
fill_mask_holes: True
blur_mask_pixels: 16.0
invert_mask: False
blend_pixels: 32.0
rescale_algorithm: bicubic
mode: forced size
force_width: 1024
force_height: 1024
rescale_factor: 1.0
min_width: 768
min_height: 768
max_width: 1024
max_height: 1024
padding: 64
13 InpaintStitch
rescale_algorithm: bislerp
3 SaveImage
filename_prefix: procd/disc_fix
--------------------------------------------------------------------------------
-> Using workflow data from: disc_fix_new_nodes_00005_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
7 UNETLoader
unet_name: flux1-fill-dev.safetensors
weight_dtype: default
11 DifferentialDiffusion
strength: 1.0
5 CLIPTextEncode
text: she was beautiful when she was young, long hair, large chest, cute eyes, puffy lips, but spent her life in hostess bars and nightclubs. now she is thirty and as she looks into the camera her face tells the story of her wild youth, She is wearing revealing bright yellow swimwear, a gold necklace hangs just above ample cleavage. She rests her hand on a jar of strawberry jam. Sitting next to her is her younger friend, cuter and busty, shorter hair and a tighter bright green bikini, she has a naughty wicked smile.
6 FluxGuidance
guidance: 25.0
8 VAELoader
vae_name: ae.safetensors
9 DualCLIPLoader
clip_name1: clip_l.safetensors
clip_name2: t5xxl_fp16.safetensors
type: flux
device: default
17 CLIPTextEncode
4 LoadImage
image: clipspace/clipspace-painted-masked-123953.png [input]
20 LoadImage
image: clipspace/clipspace-painted-masked-146838.png [input]
21 InpaintCropImproved
downscale_algorithm: lanczos
upscale_algorithm: bicubic
preresize: False
preresize_mode: ensure minimum resolution
preresize_min_width: 1024
preresize_min_height: 1024
preresize_max_width: 16384
preresize_max_height: 16384
mask_fill_holes: True
mask_expand_pixels: 0
mask_invert: False
mask_blend_pixels: 32
mask_hipass_filter: 0.1
extend_for_outpainting: False
extend_up_factor: 1.0
extend_down_factor: 1.0
extend_left_factor: 1.0
extend_right_factor: 1.0
context_from_mask_extend_factor: 1.2
output_resize_to_target_size: True
output_target_width: 1024
output_target_height: 1024
output_padding: 32
22 InpaintStitchImproved
23 InpaintModelConditioning
1 KSampler
seed: 941018182645695
steps: 30
cfg: 1.0
sampler_name: euler
scheduler: beta
denoise: 1.0
param1: randomize
2 VAEDecode
3 SaveImage
filename_prefix: procd/disc_fix_new_nodes
--------------------------------------------------------------------------------
-> Using workflow data from: dual_controlnet_anime_sd35.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: hand_rescue_00009_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
8 VAELoader
vae_name: ae.safetensors
17 CLIPTextEncode
9 DualCLIPLoader
clip_name1: clip_l.safetensors
clip_name2: t5xxl_fp8_e4m3fn.safetensors
type: flux
device: default
5 CLIPTextEncode
text: early forties cute accomplished confident female executive with small delicate hands, tastefully painted nails, conservative silk blouse, expensive accessories, tasteful jewelry, nice makeup, realistic skin details. tags: elegance, rich, charm
6 FluxGuidance
guidance: 30.0
10 InpaintModelConditioning
7 UNETLoader
unet_name: flux1-fill-dev.safetensors
weight_dtype: default
11 DifferentialDiffusion
1 KSampler
seed: 1029107972313463
steps: 30
cfg: 1.0
sampler_name: dpmpp_2m
scheduler: sgm_uniform
denoise: 1.0
param1: randomize
2 VAEDecode
4 LoadImage
image: clipspace/clipspace-mask-1458279.299999997.png [input]
upload: image
15 InpaintExtendOutpaint
12 InpaintCrop
context_expand_pixels: 20
context_expand_factor: 1.0
fill_mask_holes: True
blur_mask_pixels: 16.0
invert_mask: False
blend_pixels: 32.0
rescale_algorithm: bicubic
mode: forced size
force_width: 1024
force_height: 1024
rescale_factor: 1.0
min_width: 768
min_height: 768
max_width: 1024
max_height: 1024
padding: 64
13 InpaintStitch
rescale_algorithm: bislerp
3 SaveImage
filename_prefix: flux_gen_inp/hand_rescue
--------------------------------------------------------------------------------
-> Using workflow data from: inpaint_chain_fix_00001_.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: invoke_sample_alley_dog.png
No valid upstream nodes found.
-> Using workflow data from: long_prompt.0001.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: monkeyvine_DUB_00002_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
10 VAELoader
vae_name: ae.safetensors
5 EmptyLatentImage
width: 1024
height: 1024
batch_size: 1
16 KSamplerSelect
sampler_name: dpmpp_2m
17 BasicScheduler
scheduler: sgm_uniform
steps: 23
denoise: 1.0
11 DualCLIPLoader
clip_name1: t5xxl_fp16.safetensors
clip_name2: clip_l.safetensors
type: flux
device: default
26 CLIPTextEncodeFlux
clip_l: summer, realistic, lush
t5xxl: photograph of a cedar fence in a N American back yard, a bushy, flowering vine grows out of the ground and climbs up the fence, vine spreads out a few feet to either side of the top of the fence, there are about a dozen medium-sized monkeys on the vine and fence, some monkeys hanging, some monkeys sitting
guidance: 5.0
12 UNETLoader
unet_name: pixelwave_flux1_dev_bf16_03.safetensors
weight_dtype: default
22 BasicGuider
25 RandomNoise
noise_seed: 776356425387669
param1: fixed
13 SamplerCustomAdvanced
8 VAEDecode
34 SaveImage
filename_prefix: gend/monkeyvine/monkeyvine_DUB
--------------------------------------------------------------------------------
-> Using workflow data from: multi_save_from_preview_check.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: one.png
No valid upstream nodes found.
-> Using workflow data from: redux_1_00002_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
10 VAELoader
vae_name: ae.safetensors
16 KSamplerSelect
sampler_name: euler
17 BasicScheduler
scheduler: simple
steps: 20
denoise: 1.0
42 StyleModelLoader
style_model_name: flux1-redux-dev.safetensors
11 DualCLIPLoader
clip_name1: t5xxl_fp16.safetensors
clip_name2: clip_l.safetensors
type: flux
device: default
6 CLIPTextEncode
text: mysterious sultry woman named Alice23. this is a photograph of the time Alice23 came over to welcome our back yard when we moved in, when Alice23 brought wine and treats, we were sitting on the patio in the garden, she was irresistible, so full of desire.
speak_and_recognation: [false, true]
26 FluxGuidance
guidance: 4.0
40 LoadImage
image: alice_35_00010_.png
38 CLIPVisionLoader
clip_name: sigclip_vision_patch14_384.safetensors
39 CLIPVisionEncode
crop: none
41 StyleModelApply
strength: 0.85
strength_type: multiply
12 UNETLoader
unet_name: pixelwave_flux1_dev_bf16_03.safetensors
weight_dtype: default
30 ModelSamplingFlux
max_shift: 1.15
base_shift: 0.5
width: 1024
height: 960
22 BasicGuider
25 RandomNoise
noise_seed: 162089893908859
param1: randomize
34 PrimitiveNode
35 PrimitiveNode
27 EmptySD3LatentImage
width: 1024
height: 960
batch_size: 4
13 SamplerCustomAdvanced
8 VAEDecode
9 SaveImage
filename_prefix: gend/patio/redux_1
--------------------------------------------------------------------------------
-> Using workflow data from: red_head_3k_00002_.png
Unified Node Metadata:
--------------------------------------------------------------------------------
67 ConditioningZeroOut
68 ConditioningSetTimestepRange
start: 0.1
end: 1.0
71 CLIPTextEncode
text: over exposed, saturated colors, blown out
70 ConditioningSetTimestepRange
start: 0.0
end: 0.1
69 ConditioningCombine
11 TripleCLIPLoader
clip_name1: clip_g.safetensors
clip_name2: clip_l.safetensors
clip_name3: t5xxl_fp8_e4m3fn.safetensors
6 CLIPTextEncode
text: POV shot, to bring viewer focus on the subject, frame tight and expose for subject letting background go dark.
We are sitting in a red vinyl booth in a row of them, across from a pretty but trashy heavyset but not fat red haired woman, early forties, rough skin, freckles, piercings, tattoos, looks like tramp, makeup is overdone, she is drunk, she is very promiscuous but does not care, dressed for public but provocatively, she is coming on to us, she wants to take us home, her expression is lustful, twirls her hair to tease us
302 LoadImage
image: sd3_babe_00022_.png
upload: image
304 UpscaleModelLoader
model_name: nmkdSiaxCX_200k.pth
312 KSamplerSelect
sampler_name: euler
314 DetailDaemonSamplerNode
detail_amount: 0.16
start: 0.15
end: 0.87
bias: 0.5
exponent: 1.0
start_offset: 0.0
end_offset: 0.0
fade: 0.0
smooth: True
cfg_scale_override: 0.0
4 CheckpointLoaderSimple
ckpt_name: sd3.5_large.safetensors
13 ModelSamplingSD3
shift: 3.04
316 BasicScheduler
scheduler: beta
steps: 20
denoise: 0.16
311 UltimateSDUpscaleCustomSample
upscale_by: 2.0
seed: 1061959295871139
steps: 20
cfg: 8.0
sampler_name: euler
scheduler: normal
denoise: 0.2
mode_type: Chess
tile_width: 1024
tile_height: 1024
mask_blur: 8
tile_padding: 32
seam_fix_mode: None
seam_fix_denoise: 1.0
seam_fix_width: 64
seam_fix_mask_blur: 8
seam_fix_padding: 16
force_uniform_tiles: True
tiled_decode: False
param2: randomize
317 SaveImage
filename_prefix: procd/red_head_3k
--------------------------------------------------------------------------------
-> Using workflow data from: renamed_outpaint.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: saved_from_preview.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: sd3.5_atm.0001.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: source_inpaint_00034_.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
-> Using workflow data from: straight_gen_monkeys.png
-> WARNING: Filename and SaveImage prefix do not match.
Workflow metadata may not correspond to this PNG.
+872
View File
@@ -0,0 +1,872 @@
--- saved_from_preview.png :: prompt ---
{
"9": {
"inputs": {
"filename_prefix": "WIP/more-groupies"
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"11": {
"inputs": {
"clip_name1": "clip_l.safetensors",
"clip_name2": "t5xxl_fp16.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader",
"_meta": {
"title": "DualCLIPLoader"
}
},
"12": {
"inputs": {
"unet_name": "pixelwave_flux1_dev_bf16_03.safetensors",
"weight_dtype": "default"
},
"class_type": "UNETLoader",
"_meta": {
"title": "Load Diffusion Model"
}
},
"26": {
"inputs": {
"clip_l": "",
"t5xxl": "woman fashion model wearing pink clothes. Background is a magical fantast world.",
"guidance": 3.5,
"speak_and_recognation": {
"__value__": [
false,
true
]
},
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncodeFlux",
"_meta": {
"title": "CLIPTextEncodeFlux"
}
},
"27": {
"inputs": {
"image": "ControlNet_00010_.png"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
},
"is_changed": [
"c6c822c779d69b92244901f5a80353ec09857d264aa937ec47d21ad6ab299abc"
]
},
"28": {
"inputs": {
"model_name": "4x_NMKD-Siax_200k.pth"
},
"class_type": "UpscaleModelLoader",
"_meta": {
"title": "Load Upscale Model"
}
},
"29": {
"inputs": {
"upscale_by": 2.0,
"seed": 285076160655419,
"steps": 1,
"cfg": 1.0,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 0.25,
"mode_type": "Linear",
"tile_width": 3072,
"tile_height": 2048,
"mask_blur": 8,
"tile_padding": 32,
"seam_fix_mode": "None",
"seam_fix_denoise": 1.0,
"seam_fix_width": 64,
"seam_fix_mask_blur": 8,
"seam_fix_padding": 16,
"force_uniform_tiles": true,
"tiled_decode": false,
"image": [
"27",
0
],
"model": [
"12",
0
],
"positive": [
"26",
0
],
"negative": [
"32",
0
],
"vae": [
"31",
0
],
"upscale_model": [
"28",
0
]
},
"class_type": "UltimateSDUpscale",
"_meta": {
"title": "Ultimate SD Upscale"
}
},
"30": {
"inputs": {
"images": [
"29",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"31": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "Load VAE"
}
},
"32": {
"inputs": {
"text": "",
"speak_and_recognation": {
"__value__": [
false,
true
]
},
"clip": [
"11",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP neg (null)"
}
},
"35": {
"inputs": {
"rgthree_comparer": {
"images": [
{
"name": "A",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_lnusm_00001_.png&type=temp&subfolder=&rand=0.7650094165599786"
},
{
"name": "B",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_lnusm_00002_.png&type=temp&subfolder=&rand=0.562813615611472"
}
]
},
"image_a": [
"29",
0
],
"image_b": [
"36",
0
]
},
"class_type": "Image Comparer (rgthree)",
"_meta": {
"title": "Image Comparer (rgthree)"
}
},
"36": {
"inputs": {
"upscale_method": "lanczos",
"width": 3072,
"height": 2048,
"crop": "disabled",
"image": [
"27",
0
]
},
"class_type": "ImageScale",
"_meta": {
"title": "Upscale Image"
}
}
}
--- saved_from_preview.png :: workflow ---
{
"id": "0e71b09d-b53a-4e26-9db6-4b6bd08b4367",
"revision": 0,
"last_node_id": 36,
"last_link_id": 57,
"nodes": [
{
"id": 12,
"type": "UNETLoader",
"pos": [
-210.41494750976562,
33.1084098815918
],
"size": [
315,
82
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "MODEL",
"type": "MODEL",
"slot_index": 0,
"links": [
49
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "UNETLoader",
"widget_ue_connectable": {}
},
"widgets_values": [
"pixelwave_flux1_dev_bf16_03.safetensors",
"default"
]
},
{
"id": 11,
"type": "DualCLIPLoader",
"pos": [
-213.8916015625,
181.1158447265625
],
"size": [
315,
130
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "CLIP",
"type": "CLIP",
"slot_index": 0,
"links": [
41,
54
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "DualCLIPLoader",
"widget_ue_connectable": {}
},
"widgets_values": [
"clip_l.safetensors",
"t5xxl_fp16.safetensors",
"flux",
"default"
]
},
{
"id": 32,
"type": "CLIPTextEncode",
"pos": [
502.1035461425781,
495.9355773925781
],
"size": [
400,
200
],
"flags": {
"collapsed": true
},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 54
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"links": [
47
]
}
],
"title": "CLIP neg (null)",
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "CLIPTextEncode",
"widget_ue_connectable": {}
},
"widgets_values": [
"",
[
false,
true
]
]
},
{
"id": 31,
"type": "VAELoader",
"pos": [
329.6730651855469,
571.5662231445312
],
"size": [
315,
58
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "VAE",
"type": "VAE",
"slot_index": 0,
"links": [
46
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "VAELoader",
"widget_ue_connectable": {}
},
"widgets_values": [
"ae.safetensors"
]
},
{
"id": 28,
"type": "UpscaleModelLoader",
"pos": [
324.1542053222656,
693.7874755859375
],
"size": [
315,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "UPSCALE_MODEL",
"type": "UPSCALE_MODEL",
"slot_index": 0,
"links": [
45
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "UpscaleModelLoader",
"widget_ue_connectable": {}
},
"widgets_values": [
"4x_NMKD-Siax_200k.pth"
]
},
{
"id": 27,
"type": "LoadImage",
"pos": [
-226.15814208984375,
455.2253723144531
],
"size": [
315,
314
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
48,
55
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "LoadImage",
"widget_ue_connectable": {}
},
"widgets_values": [
"ControlNet_00010_.png",
"image"
]
},
{
"id": 36,
"type": "ImageScale",
"pos": [
372.29241943359375,
939.8795166015625
],
"size": [
315,
130
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 55
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
56
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "ImageScale",
"widget_ue_connectable": {}
},
"widgets_values": [
"lanczos",
3072,
2048,
"disabled"
]
},
{
"id": 26,
"type": "CLIPTextEncodeFlux",
"pos": [
226.45809936523438,
113.9797592163086
],
"size": [
423.9251708984375,
328.59814453125
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "clip",
"type": "CLIP",
"link": 41
}
],
"outputs": [
{
"name": "CONDITIONING",
"type": "CONDITIONING",
"slot_index": 0,
"links": [
50
]
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "CLIPTextEncodeFlux",
"widget_ue_connectable": {}
},
"widgets_values": [
"",
"woman fashion model wearing pink clothes. Background is a magical fantast world.",
3.5,
[
false,
true
],
[
false,
true
]
]
},
{
"id": 29,
"type": "UltimateSDUpscale",
"pos": [
806.073486328125,
194.67953491210938
],
"size": [
315,
614
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 48
},
{
"name": "model",
"type": "MODEL",
"link": 49
},
{
"name": "positive",
"type": "CONDITIONING",
"link": 50
},
{
"name": "negative",
"type": "CONDITIONING",
"link": 47
},
{
"name": "vae",
"type": "VAE",
"link": 46
},
{
"name": "upscale_model",
"type": "UPSCALE_MODEL",
"link": 45
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"slot_index": 0,
"links": [
44,
57
]
}
],
"properties": {
"cnr_id": "comfyui_ultimatesdupscale",
"ver": "4ab93ca0d467dbd5619ce6f0b968cb62c849e35e",
"Node name for S&R": "UltimateSDUpscale",
"widget_ue_connectable": {}
},
"widgets_values": [
2,
285076160655419,
"randomize",
1,
1,
"euler",
"normal",
0.25,
"Linear",
3072,
2048,
8,
32,
"None",
1,
64,
8,
16,
true,
false
]
},
{
"id": 30,
"type": "PreviewImage",
"pos": [
1285.279296875,
172.46987915039062
],
"size": [
889.6806640625,
874.9285888671875
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 44
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "PreviewImage",
"widget_ue_connectable": {}
},
"widgets_values": []
},
{
"id": 9,
"type": "SaveImage",
"pos": [
1565.9173583984375,
-17.753273010253906
],
"size": [
985.3012084960938,
1060.3828125
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": null
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.62",
"Node name for S&R": "SaveImage",
"widget_ue_connectable": {}
},
"widgets_values": [
"WIP/more-groupies"
]
},
{
"id": 35,
"type": "Image Comparer (rgthree)",
"pos": [
783.7305297851562,
932.9468383789062
],
"size": [
1177.1776123046875,
967.869140625
],
"flags": {},
"order": 11,
"mode": 0,
"inputs": [
{
"dir": 3,
"name": "image_a",
"type": "IMAGE",
"link": 57
},
{
"dir": 3,
"name": "image_b",
"type": "IMAGE",
"link": 56
}
],
"outputs": [],
"properties": {
"cnr_id": "rgthree-comfy",
"ver": "0fb1e239a903e93ef626a8c20589b38f46e39dff",
"comparer_mode": "Slide",
"widget_ue_connectable": {}
},
"widgets_values": [
[
{
"name": "A",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_lnusm_00001_.png&type=temp&subfolder=&rand=0.7650094165599786"
},
{
"name": "B",
"selected": true,
"url": "/api/view?filename=rgthree.compare._temp_lnusm_00002_.png&type=temp&subfolder=&rand=0.562813615611472"
}
]
]
}
],
"links": [
[
41,
11,
0,
26,
0,
"CLIP"
],
[
44,
29,
0,
30,
0,
"IMAGE"
],
[
45,
28,
0,
29,
5,
"UPSCALE_MODEL"
],
[
46,
31,
0,
29,
4,
"VAE"
],
[
47,
32,
0,
29,
3,
"CONDITIONING"
],
[
48,
27,
0,
29,
0,
"IMAGE"
],
[
49,
12,
0,
29,
1,
"MODEL"
],
[
50,
26,
0,
29,
2,
"CONDITIONING"
],
[
54,
11,
0,
32,
0,
"CLIP"
],
[
55,
27,
0,
36,
0,
"IMAGE"
],
[
56,
36,
0,
35,
1,
"IMAGE"
],
[
57,
29,
0,
35,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.5644739300537782,
"offset": [
-76.0616604814901,
-220.8358591902047
]
},
"node_versions": {
"comfy-core": "0.3.12",
"rgthree-comfy": "4fc1d9232f906d801f2451a82104f28bddfb392b",
"ComfyUI_UltimateSDUpscale": "e617ff20e7ef5baf6526c5ff4eb46a35d24ecbba"
},
"ue_links": [],
"links_added_by_ue": [],
"frontendVersion": "1.26.13"
},
"version": 0.4,
"seed_widgets": {
"29": 1
}
}
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 MiB

Before

Width:  |  Height:  |  Size: 3.4 MiB

After

Width:  |  Height:  |  Size: 3.4 MiB

+1 -1
View File
@@ -4,7 +4,7 @@
# Uses ComfyUI's own input-graph logic via comfy_exec_core.py
# to extract model, prompt, and sampler data from PNG tEXt chunks.
# ---------------------------------------------------------------------
# Copyright © 2025 Beak11
# Copyright © 2025 Beak
# Portions derived from ComfyUI (GPL-3.0)
# ---------------------------------------------------------------------
+160 -5
View File
@@ -74,6 +74,97 @@ def trace_upstream_nodes(workflow_json):
return out
def make_hashable(v): # kind of a helper function
"""
Convert lists/dicts into hashable tuples for duplicate detection.
Keeps original structure unchanged.
"""
if isinstance(v, list):
return tuple(make_hashable(x) for x in v)
if isinstance(v, dict):
return tuple(sorted((k, make_hashable(v[k])) for k in v))
return v
def is_useless_params(params):
if not params:
return True
for k, v in params.items():
# skip placeholder paramX keys entirely
if k.startswith("param"):
continue
# empty or whitespace string
if isinstance(v, str) and not v.strip():
continue
# list of booleans
if isinstance(v, list) and all(isinstance(x, bool) for x in v):
continue
# empty list
if isinstance(v, list) and not v:
continue
# boolean
if isinstance(v, bool):
continue
# anything else is useful
return False
# if we never found a useful param:
return True
def unfucked_float(v):
if isinstance(v, float):
# If it's close to a short decimal, round visually
rounded = round(v, 6)
# If rounding eliminates noise, use it
if abs(v - rounded) < 1e-9:
return str(rounded)
# otherwise return raw float
return str(v)
return v
def clean_value(v):
if isinstance(v, float):
return unfucked_float(v)
elif isinstance(v, list):
return [clean_value(x) for x in v]
elif isinstance(v, dict):
return {k: clean_value(v2) for k, v2 in v.items()}
else:
return v
def looks_like_preview(file_stem, unified_nodes):
"""
Decide if this PNG was likely saved from Preview/Comparer rather than a SaveImage node.
We compare the PNG stem against any SaveImage filename_prefix values in the unified data.
"""
prefixes = []
for u in unified_nodes:
if u.get("type") == "SaveImage":
params = u.get("params", {})
prefix = params.get("filename_prefix")
if prefix:
# basename of "folder/prefix"
prefixes.append(Path(prefix).stem.lower())
# No SaveImage in unified at all → strongly suggests preview/comparer
if not prefixes:
return True
stem = file_stem.lower()
# If filename starts with ANY SaveImage prefix → normal SaveImage output
for p in prefixes:
if stem.startswith(p):
return False
# Otherwise → saved-from-preview/comparer
return True
def print_nicely(unified_nodes, chain):
"""
@@ -92,22 +183,58 @@ def print_nicely(unified_nodes, chain):
print(f"{u['id']:>4} {u['type']}")
params = u["params"]
# --- Cleanup pass: remove duplicates and unwrap values ---
cleaned = {}
seen_values = set()
for key, value in params.items():
# 1. Unwrap {"__value__": ...}
if isinstance(value, dict) and "__value__" in value:
value = value["__value__"]
# 2. Create hashable comparison value
hval = make_hashable(value)
# 3. Remove paramN if a named param has identical value
if key.startswith("param"):
if hval in seen_values:
continue
else:
seen_values.add(hval)
# 4. Remove useless LoadImage "image" param duplicates
if key.startswith("param") and value == "image":
continue
cleaned[key] = value
params = cleaned
if is_useless_params(params):
continue
if not params:
print(" (no params)")
continue # just skip these
#print(" (no params)")
else:
for k, v in params.items():
# pretty-print JSON/dicts/lists for readability
clean_v = clean_value(v)
if isinstance(v, (dict, list)):
v_str = json.dumps(v)
v_str = json.dumps(clean_v)
else:
v_str = str(v)
v_str = str(clean_v)
# indent long values nicely
if "\n" in v_str:
lines = v_str.splitlines()
print(f" {k}: {lines[0]}")
print(f" {k}: {lines[0]}")
for line in lines[1:]:
print(f" {line}")
print(f" {line}")
else:
print(f" {k}: {v_str}")
@@ -146,6 +273,34 @@ def main():
unified = unify_prompt_and_workflow(prompt_json, workflow_json)
chain = trace_upstream_nodes(workflow_json)
# ---- SaveImage filename match detection ----
# unified: dict[node_id] -> node_data
# Extract filename_prefixes from SaveImage nodes
prefixes = []
for u in unified.values():
if u.get("type") == "SaveImage":
prefix = u.get("params", {}).get("filename_prefix")
if prefix:
prefixes.append(Path(prefix).stem.lower())
png_stem = path.stem.lower()
def filename_matches_any_prefix(png_stem, prefixes):
for p in prefixes:
# loose match: remove non-alphanumerics
sp = "".join(ch for ch in p if ch.isalnum())
ss = "".join(ch for ch in png_stem if ch.isalnum())
if ss.startswith(sp):
return True
return False
if prefixes and not filename_matches_any_prefix(png_stem, prefixes):
print("-> WARNING: Filename and SaveImage prefix do not match.")
print(" Workflow metadata may not correspond to this PNG.\n")
continue
if not chain:
print("No valid upstream nodes found.\n")
continue
+20 -5
View File
@@ -1,6 +1,8 @@
import struct, json, zlib
import struct, json, zlib, sys
from pathlib import Path
sys.stdout.reconfigure(encoding='utf-8')
def pretty_print_png_json(file_path):
"""Read PNG metadata chunks (prompt/workflow) and print pretty JSON."""
try:
@@ -36,7 +38,7 @@ def pretty_print_png_json(file_path):
print(f"\n--- {file_path.name} :: {keyword} ---")
try:
parsed = json.loads(text)
print(json.dumps(parsed, indent=2, ensure_ascii=False))
print(json.dumps(parsed, indent=2, ensure_ascii=False).rstrip())
except json.JSONDecodeError:
print(text)
@@ -47,6 +49,19 @@ def pretty_print_png_json(file_path):
if __name__ == "__main__":
folder = Path("images")
for png in folder.glob("*.png"):
pretty_print_png_json(png)
import sys
if len(sys.argv) > 1:
# Parse a single file
file_path = Path(sys.argv[1])
if file_path.exists():
pretty_print_png_json(file_path)
else:
print(f"[!] File not found: {file_path}")
else:
# Default behavior: process all PNGs in images/
folder = Path("images")
for png in folder.glob("*.png"):
pretty_print_png_json(png)
File diff suppressed because it is too large Load Diff