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:
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
Reference in New Issue
Block a user