Try an outfit on a character
Combine a character and clothing reference into a set of fashion photographs.
下载工作流在 Cloud 中试用 API 文档
查看工作流内部
源模板的只读预览。在 Cloud 中打开,即可查看节点并进行修改。
Loading the graph
Open full-size workflow preview- 作者
- Rob
从代码中调用该模型
以下请求使用与体验区相同的预设图和设置。每次提交都可能开始一次付费运行;如果提交结果未知,请勿自动重试。
1 获取 API 密钥 ↗
What you need
- Runs on
- Comfy Cloud
- 密钥
- COMFY_API_KEY
- 你的文件
- 由代码根据链接上传
需要付费的 Cloud 方案和额度。
# Python 3.10+: pip install comfy-sdk==0.4.0
import os
from comfy_sdk import Comfy
api_key = os.environ.get("COMFY_API_KEY", "").strip()
if not api_key: raise RuntimeError("Set COMFY_API_KEY")
os.environ.setdefault("COMFY_BASE_URL", "https://cloud.comfy.org")
client = Comfy(api_key=api_key)
workflow = client.workflows.from_json({
"1": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_image1_FILENAME"
},
"_meta": {
"title": "Load Subject Image"
}
},
"5": {
"class_type": "PrimitiveStringMultiline",
"inputs": {
"value": "A 2x2 (2 rows, 2 cols) grid of high fashion photoshoot images of the model wearing the outfit from image 2, each grid image should show the a full body shot of the subject in slightly different poses. Ensure that all outfit clothes/accessories are present in each grid image.\n\nDO NOT generate the grid with any visible borders or gutters.\n\nThe setting is a studio environment with a white studio background. Ensure that each grid image has the same lighting conditions. \n\nThe image is shot on fuji velvia film on a 55mm prime lens, the light is concentrated on the subject."
},
"_meta": {
"title": "Prompt"
}
},
"8": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-image_stitched",
"images": [
"9",
0
]
},
"_meta": {
"title": "Save Stitched Image"
}
},
"9": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"36",
0
],
"model": "gemini-3-pro-image-preview",
"prompt": [
"5",
0
],
"resolution": "4K",
"response_modalities": "IMAGE+TEXT",
"seed": 12345,
"system_prompt": "You are an expert image-generation engine. You must ALWAYS produce an image.\nInterpret all user input—regardless of format, intent, or abstraction—as literal visual directives for image composition.\nIf a prompt is conversational or lacks specific visual details, you must creatively invent a concrete visual scenario that depicts the concept.\nPrioritize generating the visual representation above any text, formatting, or conversational requests."
},
"_meta": {
"title": "Nano Banana Pro (Google Gemini Image)"
}
},
"10": {
"class_type": "PrimitiveInt",
"inputs": {
"value": 0
},
"_meta": {
"title": "Crop Inset Grid Images"
}
},
"12": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-image_1",
"images": [
"11:8",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"13": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-image_2",
"images": [
"11:9",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"14": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-image_3",
"images": [
"11:10",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"15": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "ComfyUI-image_4",
"images": [
"11:11",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"35": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_image2_FILENAME"
},
"_meta": {
"title": "Load Outfit Image"
}
},
"36": {
"class_type": "ImageBatch",
"inputs": {
"image1": [
"1",
0
],
"image2": [
"37",
0
]
},
"_meta": {
"title": "Batch Images (DEPRECATED)"
}
},
"37": {
"class_type": "ResizeAndPadImage",
"inputs": {
"image": [
"35",
0
],
"interpolation": "area",
"padding_color": "white",
"target_height": [
"38",
1
],
"target_width": [
"38",
0
]
},
"_meta": {
"title": "Resize And Pad Image"
}
},
"38": {
"class_type": "GetImageSize",
"inputs": {
"image": [
"1",
0
]
},
"_meta": {
"title": "Get Image Size"
}
},
"11:10": {
"class_type": "ImageCrop",
"inputs": {
"height": [
"11:16",
0
],
"image": [
"9",
0
],
"width": [
"11:15",
0
],
"x": [
"11:24",
0
],
"y": [
"11:12",
0
]
},
"_meta": {
"title": "3"
}
},
"11:11": {
"class_type": "ImageCrop",
"inputs": {
"height": [
"11:16",
0
],
"image": [
"9",
0
],
"width": [
"11:15",
0
],
"x": [
"11:13",
0
],
"y": [
"11:12",
0
]
},
"_meta": {
"title": "4"
}
},
"11:12": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:16",
0
],
"b": [
"11:14",
0
],
"value": "a + (b/2)"
},
"_meta": {
"title": "Row 2 - Y val"
}
},
"11:13": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:15",
0
],
"b": [
"11:14",
0
],
"value": "a + (b/2)"
},
"_meta": {
"title": "Col 2 - X val"
}
},
"11:14": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"10",
0
],
"b": 0,
"value": "a"
},
"_meta": {
"title": "Crop Inset Grid Images Value"
}
},
"11:15": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:17",
0
],
"b": [
"11:14",
0
],
"value": "(a-2*b) / 2"
},
"_meta": {
"title": "WIDTH"
}
},
"11:16": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:17",
1
],
"b": [
"11:14",
0
],
"value": "(a-2*b) / 2"
},
"_meta": {
"title": "HEIGHT"
}
},
"11:17": {
"class_type": "GetImageSize",
"inputs": {
"image": [
"9",
0
]
},
"_meta": {
"title": "Get Image Size"
}
},
"11:19": {
"class_type": "ImageBatchMulti",
"inputs": {
"image_1": [
"11:8",
0
],
"image_2": [
"11:9",
0
],
"image_3": [
"11:10",
0
],
"image_4": [
"11:11",
0
],
"inputcount": 4
},
"_meta": {
"title": "Image Batch Multi"
}
},
"11:20": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": [
"11:22",
0
],
"image": [
"11:19",
0
],
"keep_proportion": "stretch",
"pad_color": "0, 0, 0",
"upscale_method": "nearest-exact",
"width": [
"11:23",
0
]
},
"_meta": {
"title": "Resize Images"
}
},
"11:21": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"11:20",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"11:22": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:17",
1
],
"b": 0,
"value": "(a) / 2"
},
"_meta": {
"title": "HEIGHT / 2"
}
},
"11:23": {
"class_type": "SimpleMath+",
"inputs": {
"a": [
"11:17",
0
],
"b": 0,
"value": "(a) / 2"
},
"_meta": {
"title": "WIDTH / 2"
}
},
"11:24": {
"class_type": "SimpleMath+",
"inputs": {
"a": 0,
"b": [
"11:14",
0
],
"value": "b/2"
},
"_meta": {
"title": "Col 1 - X val"
}
},
"11:4": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"11:8",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"11:5": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"11:9",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"11:6": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"11:10",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"11:7": {
"class_type": "PreviewImage",
"inputs": {
"images": [
"11:11",
0
]
},
"_meta": {
"title": "Preview Image"
}
},
"11:8": {
"class_type": "ImageCrop",
"inputs": {
"height": [
"11:16",
0
],
"image": [
"9",
0
],
"width": [
"11:15",
0
],
"x": [
"11:24",
0
],
"y": [
"11:24",
0
]
},
"_meta": {
"title": "1"
}
},
"11:9": {
"class_type": "ImageCrop",
"inputs": {
"height": [
"11:16",
0
],
"image": [
"9",
0
],
"width": [
"11:15",
0
],
"x": [
"11:13",
0
],
"y": 0
},
"_meta": {
"title": "2"
}
}
})
workflow.set_input("1", "image", client.assets.from_url("https://media.comfy.org/website/workshop/workflows/virtual-try-on/subject-2048.jpg"))
workflow.set_input("35", "image", client.assets.from_url("https://cdn.jsdelivr.net/gh/Comfy-Org/workflow_templates@90c71fb78b3726392d010ff62a8e79e92d7296ad/input/outfit.png"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)
for output in job.get_outputs("8"):
output.to_file(output.name)
for output in job.get_outputs("12"):
output.to_file(output.name)
for output in job.get_outputs("13"):
output.to_file(output.name)
for output in job.get_outputs("14"):
output.to_file(output.name)
for output in job.get_outputs("15"):
output.to_file(output.name)