save code

This commit is contained in:
colomi
2025-07-11 22:10:56 +08:00
parent 8de064f43e
commit 4ca55230e8
6 changed files with 1758 additions and 55 deletions
+128
View File
@@ -0,0 +1,128 @@
{
"3": {
"inputs": {
"seed": 253399224428638,
"steps": 20,
"cfg": 8,
"sampler_name": "euler",
"scheduler": "normal",
"denoise": 1,
"model": [
"4",
0
],
"positive": [
"6",
0
],
"negative": [
"7",
0
],
"latent_image": [
"5",
0
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"4": {
"inputs": {
"ckpt_name": "v1-5-pruned-emaonly-fp16.safetensors"
},
"class_type": "CheckpointLoaderSimple",
"_meta": {
"title": "Load Checkpoint"
}
},
"5": {
"inputs": {
"width": 512,
"height": 512,
"batch_size": 1
},
"class_type": "EmptyLatentImage",
"_meta": {
"title": "Empty Latent Image"
}
},
"6": {
"inputs": {
"text": "masterpiece best quality girl",
"clip": [
"4",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"7": {
"inputs": {
"text": "bad hands",
"clip": [
"4",
1
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"3",
0
],
"vae": [
"4",
2
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"9": {
"inputs": {
"image": "cloth_short.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
}
},
"10": {
"inputs": {
"images": [
"8",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"12": {
"inputs": {
"filename_prefix": "MySaveImg",
"images": [
"9",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
}
}
+786
View File
@@ -0,0 +1,786 @@
{
"3": {
"inputs": {
"seed": 191964061751443,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "simple",
"denoise": 1,
"model": [
"13",
0
],
"positive": [
"17",
0
],
"negative": [
"17",
1
],
"latent_image": [
"17",
2
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"6": {
"inputs": {
"text": "",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"7": {
"inputs": {
"text": "",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"3",
0
],
"vae": [
"16",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"10": {
"inputs": {
"strength": 1,
"strength_type": "multiply",
"conditioning": [
"11",
0
],
"style_model": [
"79",
0
],
"clip_vision_output": [
"20",
0
]
},
"class_type": "StyleModelApply",
"_meta": {
"title": "Apply Style Model"
}
},
"11": {
"inputs": {
"guidance": 30,
"conditioning": [
"6",
0
]
},
"class_type": "FluxGuidance",
"_meta": {
"title": "FluxGuidance"
}
},
"12": {
"inputs": {
"clip_name1": "flux/t5xxl_fp16.safetensors",
"clip_name2": "clip_l.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader",
"_meta": {
"title": "DualCLIPLoader"
}
},
"13": {
"inputs": {
"model": [
"75",
0
]
},
"class_type": "DifferentialDiffusion",
"_meta": {
"title": "Differential Diffusion"
}
},
"16": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "Load VAE"
}
},
"17": {
"inputs": {
"noise_mask": false,
"positive": [
"10",
0
],
"negative": [
"7",
0
],
"vae": [
"16",
0
],
"pixels": [
"27",
1
],
"mask": [
"27",
2
]
},
"class_type": "InpaintModelConditioning",
"_meta": {
"title": "InpaintModelConditioning"
}
},
"20": {
"inputs": {
"crop": "center",
"clip_vision": [
"21",
0
],
"image": [
"25",
0
]
},
"class_type": "CLIPVisionEncode",
"_meta": {
"title": "CLIP Vision Encode"
}
},
"21": {
"inputs": {
"clip_name": "sigclip_vision_patch14_384.safetensors"
},
"class_type": "CLIPVisionLoader",
"_meta": {
"title": "Load CLIP Vision"
}
},
"22": {
"inputs": {
"image": "cloth_short.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
}
},
"25": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"22",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"26": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"61",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"27": {
"inputs": {
"context_expand_pixels": 20,
"context_expand_factor": 1,
"fill_mask_holes": true,
"blur_mask_pixels": 10,
"invert_mask": false,
"blend_pixels": 16,
"rescale_algorithm": "bicubic",
"mode": "ranged size",
"force_width": 1024,
"force_height": 1024,
"rescale_factor": 1,
"min_width": 512,
"min_height": 512,
"max_width": 1800,
"max_height": 1800,
"padding": 32,
"image": [
"42",
0
],
"mask": [
"30",
0
],
"optional_context_mask": [
"40",
0
]
},
"class_type": "InpaintCrop",
"_meta": {
"title": "(OLD 💀, use the new ✂️ Inpaint Crop node)"
}
},
"28": {
"inputs": {
"mask": [
"96",
0
]
},
"class_type": "MaskToImage",
"_meta": {
"title": "Convert Mask to Image"
}
},
"29": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"28",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"30": {
"inputs": {
"channel": "red",
"image": [
"43",
0
]
},
"class_type": "ImageToMask",
"_meta": {
"title": "Convert Image to Mask"
}
},
"34": {
"inputs": {
"rescale_algorithm": "bislerp",
"stitch": [
"27",
0
],
"inpainted_image": [
"8",
0
]
},
"class_type": "InpaintStitch",
"_meta": {
"title": "(OLD 💀, use the new ✂️ Inpaint Stitch node)"
}
},
"37": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"38",
0
],
"image2": [
"57",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"38": {
"inputs": {
"mask": [
"71:2",
1
]
},
"class_type": "MaskToImage",
"_meta": {
"title": "Convert Mask to Image"
}
},
"40": {
"inputs": {
"channel": "red",
"image": [
"37",
0
]
},
"class_type": "ImageToMask",
"_meta": {
"title": "Convert Image to Mask"
}
},
"42": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"25",
0
],
"image2": [
"26",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"43": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"59",
0
],
"image2": [
"29",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"45": {
"inputs": {
"images": [
"42",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"57": {
"inputs": {
"brightness": -1,
"contrast": 0,
"saturation": 0,
"sharpness": 0,
"blur": 0,
"gaussian_blur": 0,
"edge_enhance": 0,
"detail_enhance": "false",
"image": [
"26",
0
]
},
"class_type": "Image Filter Adjustments",
"_meta": {
"title": "Image Filter Adjustments"
}
},
"59": {
"inputs": {
"brightness": -1,
"contrast": 1,
"saturation": 1,
"sharpness": 1,
"blur": 0,
"gaussian_blur": 48.1,
"edge_enhance": 0,
"detail_enhance": "false",
"image": [
"25",
0
]
},
"class_type": "Image Filter Adjustments",
"_meta": {
"title": "Image Filter Adjustments"
}
},
"61": {
"inputs": {
"image": "girl_full.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
}
},
"75": {
"inputs": {
"model_path": "svdq-int4-flux.1-fill-dev",
"cache_threshold": 0,
"attention": "nunchaku-fp16",
"cpu_offload": "auto",
"device_id": 0,
"data_type": "bfloat16",
"i2f_mode": "enabled"
},
"class_type": "NunchakuFluxDiTLoader",
"_meta": {
"title": "Nunchaku FLUX DiT Loader"
}
},
"79": {
"inputs": {
"style_model_name": "flux1-redux-dev.safetensors"
},
"class_type": "StyleModelLoader",
"_meta": {
"title": "Load Style Model"
}
},
"83": {
"inputs": {
"images": [
"29",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"84": {
"inputs": {
"images": [
"43",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"85": {
"inputs": {
"mask": [
"30",
0
]
},
"class_type": "MaskPreview",
"_meta": {
"title": "MaskPreview"
}
},
"86": {
"inputs": {
"mask": [
"71:2",
1
]
},
"class_type": "MaskPreview+",
"_meta": {
"title": "🔧 Mask Preview"
}
},
"87": {
"inputs": {
"images": [
"38",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"88": {
"inputs": {
"images": [
"37",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"89": {
"inputs": {
"images": [
"57",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"90": {
"inputs": {
"images": [
"59",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"91": {
"inputs": {
"images": [
"27",
1
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
},
"93": {
"inputs": {
"mask": [
"27",
2
]
},
"class_type": "MaskPreview",
"_meta": {
"title": "MaskPreview"
}
},
"94": {
"inputs": {
"value": 1024
},
"class_type": "PrimitiveInt",
"_meta": {
"title": "Int"
}
},
"95": {
"inputs": {
"detect_hand": "disable",
"detect_body": "enable",
"detect_face": "disable",
"resolution": 512,
"bbox_detector": "yolo_nas_m_fp16.onnx",
"pose_estimator": "dw-ll_ucoco_384.onnx",
"scale_stick_for_xinsr_cn": "disable",
"image": [
"61",
0
]
},
"class_type": "DWPreprocessor",
"_meta": {
"title": "DWPose Estimator"
}
},
"96": {
"inputs": {
"changdu": "yao",
"kps": [
"95",
1
]
},
"class_type": "RenderPeopleKpsMask",
"_meta": {
"title": "My RenderPeopleKps Mask"
}
},
"97": {
"inputs": {
"mask": [
"61",
1
]
},
"class_type": "MaskPreview",
"_meta": {
"title": "MaskPreview"
}
},
"98": {
"inputs": {
"mask": [
"96",
0
]
},
"class_type": "MaskPreview",
"_meta": {
"title": "MaskPreview"
}
},
"99": {
"inputs": {
"width": 600,
"height": 1024,
"x": 700,
"y": 0,
"image": [
"34",
0
]
},
"class_type": "ImageCrop",
"_meta": {
"title": "Image Crop"
}
},
"102": {
"inputs": {
"filename_prefix": "my_test_out",
"images": [
"99",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"71:0": {
"inputs": {
"model_name": "sam_vit_h (2.56GB)"
},
"class_type": "SAMModelLoader (segment anything)",
"_meta": {
"title": "SAMModelLoader (segment anything)"
}
},
"71:1": {
"inputs": {
"model_name": "GroundingDINO_SwinT_OGC (694MB)"
},
"class_type": "GroundingDinoModelLoader (segment anything)",
"_meta": {
"title": "GroundingDinoModelLoader (segment anything)"
}
},
"71:2": {
"inputs": {
"prompt": "shoes",
"threshold": 0.3,
"sam_model": [
"71:0",
0
],
"grounding_dino_model": [
"71:1",
0
],
"image": [
"25",
0
]
},
"class_type": "GroundingDinoSAMSegment (segment anything)",
"_meta": {
"title": "GroundingDinoSAMSegment (segment anything)"
}
},
"71:3": {
"inputs": {
"images": [
"71:2",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
}
}
+630
View File
@@ -0,0 +1,630 @@
{
"3": {
"inputs": {
"seed": 351739583278114,
"steps": 20,
"cfg": 1,
"sampler_name": "euler",
"scheduler": "simple",
"denoise": 1,
"model": [
"13",
0
],
"positive": [
"17",
0
],
"negative": [
"17",
1
],
"latent_image": [
"17",
2
]
},
"class_type": "KSampler",
"_meta": {
"title": "KSampler"
}
},
"6": {
"inputs": {
"text": "",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"7": {
"inputs": {
"text": "",
"clip": [
"12",
0
]
},
"class_type": "CLIPTextEncode",
"_meta": {
"title": "CLIP Text Encode (Prompt)"
}
},
"8": {
"inputs": {
"samples": [
"3",
0
],
"vae": [
"16",
0
]
},
"class_type": "VAEDecode",
"_meta": {
"title": "VAE Decode"
}
},
"10": {
"inputs": {
"strength": 1,
"strength_type": "multiply",
"conditioning": [
"11",
0
],
"style_model": [
"79",
0
],
"clip_vision_output": [
"20",
0
]
},
"class_type": "StyleModelApply",
"_meta": {
"title": "Apply Style Model"
}
},
"11": {
"inputs": {
"guidance": 30,
"conditioning": [
"6",
0
]
},
"class_type": "FluxGuidance",
"_meta": {
"title": "FluxGuidance"
}
},
"12": {
"inputs": {
"clip_name1": "flux/t5xxl_fp16.safetensors",
"clip_name2": "clip_l.safetensors",
"type": "flux",
"device": "default"
},
"class_type": "DualCLIPLoader",
"_meta": {
"title": "DualCLIPLoader"
}
},
"13": {
"inputs": {
"model": [
"75",
0
]
},
"class_type": "DifferentialDiffusion",
"_meta": {
"title": "Differential Diffusion"
}
},
"16": {
"inputs": {
"vae_name": "ae.safetensors"
},
"class_type": "VAELoader",
"_meta": {
"title": "Load VAE"
}
},
"17": {
"inputs": {
"noise_mask": false,
"positive": [
"10",
0
],
"negative": [
"7",
0
],
"vae": [
"16",
0
],
"pixels": [
"27",
1
],
"mask": [
"27",
2
]
},
"class_type": "InpaintModelConditioning",
"_meta": {
"title": "InpaintModelConditioning"
}
},
"20": {
"inputs": {
"crop": "center",
"clip_vision": [
"21",
0
],
"image": [
"25",
0
]
},
"class_type": "CLIPVisionEncode",
"_meta": {
"title": "CLIP Vision Encode"
}
},
"21": {
"inputs": {
"clip_name": "sigclip_vision_patch14_384.safetensors"
},
"class_type": "CLIPVisionLoader",
"_meta": {
"title": "Load CLIP Vision"
}
},
"22": {
"inputs": {
"image": "cloth_short.jpg"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
}
},
"25": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"22",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"26": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"61",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"27": {
"inputs": {
"context_expand_pixels": 20,
"context_expand_factor": 1,
"fill_mask_holes": true,
"blur_mask_pixels": 10,
"invert_mask": false,
"blend_pixels": 16,
"rescale_algorithm": "bicubic",
"mode": "ranged size",
"force_width": 1024,
"force_height": 1024,
"rescale_factor": 1,
"min_width": 512,
"min_height": 512,
"max_width": 1800,
"max_height": 1800,
"padding": 32,
"image": [
"42",
0
],
"mask": [
"30",
0
],
"optional_context_mask": [
"40",
0
]
},
"class_type": "InpaintCrop",
"_meta": {
"title": "(OLD 💀, use the new ✂️ Inpaint Crop node)"
}
},
"28": {
"inputs": {
"mask": [
"96",
0
]
},
"class_type": "MaskToImage",
"_meta": {
"title": "Convert Mask to Image"
}
},
"29": {
"inputs": {
"width": [
"94",
0
],
"height": [
"94",
0
],
"interpolation": "nearest",
"method": "keep proportion",
"condition": "always",
"multiple_of": 0,
"image": [
"28",
0
]
},
"class_type": "ImageResize+",
"_meta": {
"title": "🔧 Image Resize"
}
},
"30": {
"inputs": {
"channel": "red",
"image": [
"43",
0
]
},
"class_type": "ImageToMask",
"_meta": {
"title": "Convert Image to Mask"
}
},
"34": {
"inputs": {
"rescale_algorithm": "bislerp",
"stitch": [
"27",
0
],
"inpainted_image": [
"8",
0
]
},
"class_type": "InpaintStitch",
"_meta": {
"title": "(OLD 💀, use the new ✂️ Inpaint Stitch node)"
}
},
"37": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"38",
0
],
"image2": [
"57",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"38": {
"inputs": {
"mask": [
"71:2",
1
]
},
"class_type": "MaskToImage",
"_meta": {
"title": "Convert Mask to Image"
}
},
"40": {
"inputs": {
"channel": "red",
"image": [
"37",
0
]
},
"class_type": "ImageToMask",
"_meta": {
"title": "Convert Image to Mask"
}
},
"42": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"25",
0
],
"image2": [
"26",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"43": {
"inputs": {
"direction": "right",
"match_image_size": true,
"image1": [
"59",
0
],
"image2": [
"29",
0
]
},
"class_type": "ImageConcanate",
"_meta": {
"title": "Image Concatenate"
}
},
"57": {
"inputs": {
"brightness": -1,
"contrast": 0,
"saturation": 0,
"sharpness": 0,
"blur": 0,
"gaussian_blur": 0,
"edge_enhance": 0,
"detail_enhance": "false",
"image": [
"26",
0
]
},
"class_type": "Image Filter Adjustments",
"_meta": {
"title": "Image Filter Adjustments"
}
},
"59": {
"inputs": {
"brightness": -1,
"contrast": 1,
"saturation": 1,
"sharpness": 1,
"blur": 0,
"gaussian_blur": 48.1,
"edge_enhance": 0,
"detail_enhance": "false",
"image": [
"25",
0
]
},
"class_type": "Image Filter Adjustments",
"_meta": {
"title": "Image Filter Adjustments"
}
},
"61": {
"inputs": {
"image": "girl_full_2.webp"
},
"class_type": "LoadImage",
"_meta": {
"title": "Load Image"
}
},
"75": {
"inputs": {
"model_path": "svdq-int4-flux.1-fill-dev",
"cache_threshold": 0,
"attention": "nunchaku-fp16",
"cpu_offload": "auto",
"device_id": 0,
"data_type": "bfloat16",
"i2f_mode": "enabled"
},
"class_type": "NunchakuFluxDiTLoader",
"_meta": {
"title": "Nunchaku FLUX DiT Loader"
}
},
"79": {
"inputs": {
"style_model_name": "flux1-redux-dev.safetensors"
},
"class_type": "StyleModelLoader",
"_meta": {
"title": "Load Style Model"
}
},
"94": {
"inputs": {
"value": 1024
},
"class_type": "PrimitiveInt",
"_meta": {
"title": "Int"
}
},
"95": {
"inputs": {
"detect_hand": "disable",
"detect_body": "enable",
"detect_face": "disable",
"resolution": 512,
"bbox_detector": "yolo_nas_m_fp16.onnx",
"pose_estimator": "dw-ll_ucoco_384.onnx",
"scale_stick_for_xinsr_cn": "disable",
"image": [
"61",
0
]
},
"class_type": "DWPreprocessor",
"_meta": {
"title": "DWPose Estimator"
}
},
"96": {
"inputs": {
"changdu": "yao",
"kps": [
"95",
1
]
},
"class_type": "RenderPeopleKpsMask",
"_meta": {
"title": "My RenderPeopleKps Mask"
}
},
"99": {
"inputs": {
"width": 600,
"height": 1024,
"x": 700,
"y": 0,
"image": [
"34",
0
]
},
"class_type": "ImageCrop",
"_meta": {
"title": "Image Crop"
}
},
"102": {
"inputs": {
"filename_prefix": "my_test_out",
"images": [
"99",
0
]
},
"class_type": "SaveImage",
"_meta": {
"title": "Save Image"
}
},
"71:0": {
"inputs": {
"model_name": "sam_vit_h (2.56GB)"
},
"class_type": "SAMModelLoader (segment anything)",
"_meta": {
"title": "SAMModelLoader (segment anything)"
}
},
"71:1": {
"inputs": {
"model_name": "GroundingDINO_SwinT_OGC (694MB)"
},
"class_type": "GroundingDinoModelLoader (segment anything)",
"_meta": {
"title": "GroundingDinoModelLoader (segment anything)"
}
},
"71:2": {
"inputs": {
"prompt": "shoes",
"threshold": 0.3,
"sam_model": [
"71:0",
0
],
"grounding_dino_model": [
"71:1",
0
],
"image": [
"25",
0
]
},
"class_type": "GroundingDinoSAMSegment (segment anything)",
"_meta": {
"title": "GroundingDinoSAMSegment (segment anything)"
}
},
"71:3": {
"inputs": {
"images": [
"71:2",
0
]
},
"class_type": "PreviewImage",
"_meta": {
"title": "Preview Image"
}
}
}
+168 -18
View File
@@ -5,6 +5,13 @@ from flask import Flask, request, jsonify
from urllib.parse import urlparse from urllib.parse import urlparse
from volcenginesdkarkruntime import Ark from volcenginesdkarkruntime import Ark
import json import json
import base64
import time
from PIL import Image
from datetime import datetime
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_FOLDER = os.path.join(APP_ROOT, 'static')
app = Flask(__name__) app = Flask(__name__)
@@ -102,6 +109,48 @@ def save_image_from_url(image_url):
print(f"Error saving image from URL: {e}") print(f"Error saving image from URL: {e}")
return None return None
def change(human_name, cloth_name, c_width, c_height):
with open('/home/szlc/code/ComfyUI/change_cloth/change_new.json', 'r', encoding='utf-8') as file:
prompt_text = file.read()
prompt = json.loads(prompt_text)
prompt["99"]["inputs"]["width"] = int((c_width/c_height) * 1024)
#input cloth img
prompt["22"]["inputs"]["image"] = cloth_name
#input human img
prompt["61"]["inputs"]["image"] = human_name
#out put name
out_img_name = str(uuid.uuid4())[:8]
prompt["102"]["inputs"]["filename_prefix"] = out_img_name
p = {"prompt": prompt}
data = json.dumps(p).encode('utf-8')
response = requests.post("http://localhost:8188/prompt", data=data)
prompt_id = response.json()["prompt_id"]
# 2. 轮询队列,直到任务完成
while True:
queue = requests.get("http://localhost:8188/queue").json()
# print(queue)
if not queue["queue_running"] and not queue["queue_pending"]:
break # 队列为空,任务已完成
time.sleep(0.5) # 避免频繁请求
# 3. 从历史记录中获取结果
history = requests.get("http://localhost:8188/history").json()
print("History:", history)
outputs = history[prompt_id]["outputs"]
for out in outputs:
if out_img_name in out:
return out
@app.route('/change_cloth', methods=['POST']) @app.route('/change_cloth', methods=['POST'])
def change_cloth(): def change_cloth():
"""从 URL 下载图片""" """从 URL 下载图片"""
@@ -128,27 +177,128 @@ def change_cloth():
return jsonify({"filename": cloth_filename}) return jsonify({"filename": cloth_filename})
@app.route('/upload_image', methods=['POST']) def save_base64_image(base64_str, prefix):
def upload_image(): """
"""直接上传图片(保留原始格式)""" 将base64字符串保存为图片文件
if 'file' not in request.files: :param base64_str: 带有类型标识的base64字符串
return jsonify({"error": "No file uploaded"}), 400 :param prefix: 文件名前缀
:return: 保存的文件路径
"""
try:
# 分离base64头部和实际数据
header, data = base64_str.split(',', 1)
file = request.files['file'] # 从头部获取文件扩展名
if file.filename == '': file_ext = ''
return jsonify({"error": "Empty filename"}), 400 if 'image/png' in header:
file_ext = '.png'
elif 'image/jpeg' in header:
file_ext = '.jpg'
elif 'image/jpg' in header:
file_ext = '.jpg'
elif 'image/gif' in header:
file_ext = '.gif'
else:
file_ext = '.png' # 默认使用png
# 获取原始文件扩展 # 生成唯一文件
ext = os.path.splitext(file.filename)[1].lower() timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
if not ext: # 如果无扩展名,默认 PNG unique_id = str(uuid.uuid4())[:8]
ext = '.png' filename = f"{prefix}_{timestamp}_{unique_id}{file_ext}"
filepath = os.path.join('/home/szlc/code/ComfyUI/change_cloth/static', filename)
# 生成唯一文件名(保留原始格式) # 解码并保存图片
filename = f"{uuid.uuid4()}{ext}" with open(filepath, 'wb') as f:
save_path = os.path.join(COMFYUI_INPUT_DIR, filename) f.write(base64.b64decode(data))
file.save(save_path) input_filepath = os.path.join('/home/szlc/code/ComfyUI/input', filename)
return jsonify({"filename": filename}) # 解码并保存图片
with open(input_filepath, 'wb') as f:
f.write(base64.b64decode(data))
return filename
except Exception as e:
print(f"Error saving image: {str(e)}")
return None
def get_image_dimensions(image_path):
try:
with Image.open(image_path) as img:
width, height = img.size
return width, height
except Exception as e:
print(f"Error: {e}")
return None
def image_to_base64(file_path, mime_type=None):
if mime_type is None:
extension = file_path.split('.')[-1].lower()
mime_types = {
'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
'gif': 'image/gif',
'webp': 'image/webp',
'bmp': 'image/bmp'
}
mime_type = mime_types.get(extension, 'application/octet-stream')
# 读取文件内容并编码为Base64
with open(file_path, 'rb') as image_file:
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
# 组合成Data URI格式
return f"data:{mime_type};base64,{encoded_string}"
@app.route('/change_cloth_base64', methods=['POST'])
def change_cloth_base64():
# 获取参数
data = request.get_json()
if not data:
return jsonify({"ret":-1,'msg': 'No JSON data provided'}), 400
human_img = data.get('human_img')
cloth_img = data.get('cloth_img')
output_format = data.get('output_format')
if not human_img or not cloth_img:
return jsonify({"ret":-1, 'msg': 'Both human_img and cloth_img are required'}), 400
try:
# 保存人像图片
human_filename = save_base64_image(human_img, 'human')
if not human_filename:
return jsonify({"ret":-1, 'msg': 'Failed to save human image'}), 500
# 保存服装图片
cloth_filename = save_base64_image(cloth_img, 'cloth')
if not cloth_filename:
return jsonify({"ret":-1, 'msg': 'Failed to save cloth image'}), 500
w,h = get_image_dimensions(f'/home/szlc/code/ComfyUI/input/{human_filename}')
out_put_name = change(human_filename, cloth_filename, w, h)
image = Image.open(f'/home/szlc/code/ComfyUI/output/{out_put_name}')
jpg_name = out_put_name.replace(".png", ".jpg")
jpg_path_name = f'/home/szlc/code/ComfyUI/change_cloth/static/{jpg_name}'
image.save(jpg_path_name, quality=95)
if 'base64' in output_format:
return jsonify({
"ret":0,
"msg":"success",
"data":image_to_base64(jpg_path_name)
})
else:
return jsonify({
"ret":0,
"msg":"success",
"url":f"http://112.126.94.241:18018/static/{jpg_name}"
})
except Exception as e:
return jsonify({"ret":-1, 'error': str(e)}), 500
if __name__ == '__main__': if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000, debug=True) app.run(host="0.0.0.0", port=8018, debug=True)
-37
View File
@@ -34,40 +34,3 @@ def RequestImgAndSave(image_url):
# 1. 提交任务 # 1. 提交任务
#RequestImgAndSave("https://example.com/image.jpg") #RequestImgAndSave("https://example.com/image.jpg")
with open('/home/szlc/code/ComfyUI/change_cloth/change_bak_api.json', 'r', encoding='utf-8') as file:
prompt_text = file.read()
prompt = json.loads(prompt_text)
#set the text prompt for our positive CLIPTextEncode
# prompt["6"]["inputs"]["text"] = "one girl"
#set the seed for our KSampler node
# prompt["3"]["inputs"]["seed"] = 5
# prompt["9"]["inputs"]["image"] = "cloth_long.png"
prompt["102"]["inputs"]["filename_prefix"] = "xiangsilian"
p = {"prompt": prompt}
data = json.dumps(p).encode('utf-8')
response = requests.post("http://localhost:8188/prompt", data=data)
prompt_id = response.json()["prompt_id"]
# 2. 轮询队列,直到任务完成
while True:
queue = requests.get("http://localhost:8188/queue").json()
print(queue)
if not queue["queue_running"] and not queue["queue_pending"]:
break # 队列为空,任务已完成
time.sleep(0.5) # 避免频繁请求
# 3. 从历史记录中获取结果
history = requests.get("http://localhost:8188/history").json()
print("History:", history)
outputs = history[prompt_id]["outputs"]
print("Generated outputs:", outputs)
+46
View File
@@ -0,0 +1,46 @@
import threading
import requests
import json
import base64
import time
import random
def image_to_base64(file_path, mime_type=None):
if mime_type is None:
extension = file_path.split('.')[-1].lower()
mime_types = {
'jpg': 'image/jpeg',
'jpeg': 'image/jpeg',
'png': 'image/png',
'gif': 'image/gif',
'webp': 'image/webp',
'bmp': 'image/bmp'
}
mime_type = mime_types.get(extension, 'application/octet-stream')
# 读取文件内容并编码为Base64
with open(file_path, 'rb') as image_file:
encoded_string = base64.b64encode(image_file.read()).decode('utf-8')
# 组合成Data URI格式
return f"data:{mime_type};base64,{encoded_string}"
if __name__ == '__main__':
url = 'http://112.126.94.241:18018/change_cloth_base64'
headers = {'Content-Type': 'application/json'}
img64_human_str = image_to_base64("/home/szlc/code/ComfyUI/input/girl_full.jpg")
data = {}
data['human_img'] = img64_human_str
img64_cloth_str = image_to_base64("/home/szlc/code/ComfyUI/input/cloth_short.jpg")
data['cloth_img'] = img64_cloth_str
data['output_format'] = "url"
try:
response = requests.post(url, headers=headers, json=data)
print(response.text)
except Exception as e:
print("error")