1 image input Split Stack - Nano Banana 2 + Kling 3.0
Upload 1 input image and generate 5 alternate angles to be used as start frames with Kling 3.0. Each video is stacked horizontally in a final 9x16 video.
简介
This ComfyUI tutorial workflow takes a single reference image and generates five alternate camera angles to use as starting frames for Kling 3.0 image-to-video. A set of utility nodes (including Reroute and PrimitiveNode) fans out your input from LoadImage into five branches, where a preconfigured "Nano Banana 2" angle-synthesis group produces varied viewpoints of the same subject. Each start frame is saved via SaveImage so you can verify framing and subject integrity before video generation.
Each of the five frames is then sent to KlingVideoNode to create short motion clips guided by your prompt (e.g., orbit, pan, dolly). Finally, the clips are tiled into a single portrait output using CreateVideo and saved with SaveVideo. The stacker uses a horizontal strip layout inside a 9:16 canvas, so you can compare all five angles in one shareable video. Optional GeminiImage2Node can auto-caption the input image to augment your motion prompt; if not used, the workflow falls back to manual text from a PrimitiveNode.
This setup is practical when you need consistent, multi-angle starters for Kling 3.0 without hand-authoring separate variations.
你需要提供
- 正在读取工作流
在 ComfyUI 中运行。 此工作流无法在本页面运行。你可以在 Comfy Cloud 中打开(已预先加载所需内容),或下载后在自己的 ComfyUI 中使用。
在 Cloud 中试用查看工作流内部
节点图的只读预览。在 Comfy Cloud 中打开或下载后即可编辑节点。
Loading the graph
Open full-size workflow preview- 作者
- Rob
需要自定义节点
- 正在读取工作流
通过代码使用此工作流
尽可能根据工作流图和输入自动生成代码,否则显示已保存的示例。运行代码可能产生费用,请先核对凭据和端点。
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({
"41": {
"class_type": "LoadImage",
"inputs": {
"image": "UPLOADED_image_FILENAME"
},
"_meta": {
"title": "Load Image"
}
},
"758": {
"class_type": "CreateVideo",
"inputs": {
"bit_depth": "auto",
"codec": "none",
"color_space": "sRGB",
"fps": 24,
"images": [
"1222:1219",
0
]
},
"_meta": {
"title": "Create Video"
}
},
"759": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/splitstack_final",
"format": "auto",
"format.codec": "auto",
"video": [
"758",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1189": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"41",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Wide shot, the subject is in view",
"resolution": "2K",
"response_modalities": "IMAGE+TEXT",
"seed": 0,
"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)"
}
},
"1192": {
"class_type": "KlingVideoNode",
"inputs": {
"generate_audio": False,
"model": "kling-v3",
"model.aspect_ratio": "16:9",
"model.resolution": "720p",
"multi_shot": "disabled",
"multi_shot.duration": 8,
"multi_shot.negative_prompt": "",
"multi_shot.prompt": "Static camera, the subject moves across the shot",
"seed": 484688321,
"start_frame": [
"1189",
0
]
},
"_meta": {
"title": "Kling 3.0 Video"
}
},
"1196": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/stack1_kling",
"format": "auto",
"format.codec": "auto",
"video": [
"1192",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1200": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"41",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Extreme close up on the subjects eye",
"resolution": "2K",
"response_modalities": "IMAGE+TEXT",
"seed": 995219765575705,
"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)"
}
},
"1201": {
"class_type": "KlingVideoNode",
"inputs": {
"generate_audio": False,
"model": "kling-v3",
"model.aspect_ratio": "16:9",
"model.resolution": "720p",
"multi_shot": "disabled",
"multi_shot.duration": 8,
"multi_shot.negative_prompt": "",
"multi_shot.prompt": "Dolly in on the subjects eye, extreme detail",
"seed": 947661511,
"start_frame": [
"1200",
0
]
},
"_meta": {
"title": "Kling 3.0 Video"
}
},
"1202": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/stack2_kling",
"format": "auto",
"format.codec": "auto",
"video": [
"1201",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1208": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"41",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Side profile of the subject",
"resolution": "2K",
"response_modalities": "IMAGE+TEXT",
"seed": 451280254241378,
"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)"
}
},
"1209": {
"class_type": "KlingVideoNode",
"inputs": {
"generate_audio": False,
"model": "kling-v3",
"model.aspect_ratio": "16:9",
"model.resolution": "720p",
"multi_shot": "disabled",
"multi_shot.duration": 8,
"multi_shot.negative_prompt": "",
"multi_shot.prompt": "The camera pans right",
"seed": 1237402778,
"start_frame": [
"1208",
0
]
},
"_meta": {
"title": "Kling 3.0 Video"
}
},
"1210": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/stack3_kling",
"format": "auto",
"format.codec": "auto",
"video": [
"1209",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1216": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"41",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Medium shot of the subject",
"resolution": "2K",
"response_modalities": "IMAGE+TEXT",
"seed": 1064378156241404,
"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)"
}
},
"1217": {
"class_type": "KlingVideoNode",
"inputs": {
"generate_audio": False,
"model": "kling-v3",
"model.aspect_ratio": "16:9",
"model.resolution": "720p",
"multi_shot": "disabled",
"multi_shot.duration": 8,
"multi_shot.negative_prompt": "",
"multi_shot.prompt": "The camera dollies out ",
"seed": 1618448800,
"start_frame": [
"1216",
0
]
},
"_meta": {
"title": "Kling 3.0 Video"
}
},
"1218": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/stack4_kling",
"format": "auto",
"format.codec": "auto",
"video": [
"1217",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1224": {
"class_type": "GeminiImage2Node",
"inputs": {
"aspect_ratio": "auto",
"images": [
"41",
0
],
"model": "Nano Banana 2 (Gemini 3.1 Flash Image)",
"prompt": "Overhead aerial drone shot, looking down from a top perspective of the subject",
"resolution": "2K",
"response_modalities": "IMAGE+TEXT",
"seed": 540450878401556,
"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)"
}
},
"1225": {
"class_type": "KlingVideoNode",
"inputs": {
"generate_audio": False,
"model": "kling-v3",
"model.aspect_ratio": "16:9",
"model.resolution": "720p",
"multi_shot": "disabled",
"multi_shot.duration": 8,
"multi_shot.negative_prompt": "",
"multi_shot.prompt": "Dolly out and orbit as the subject remains static.",
"seed": 1154249775,
"start_frame": [
"1224",
0
]
},
"_meta": {
"title": "Kling 3.0 Video"
}
},
"1226": {
"class_type": "SaveVideo",
"inputs": {
"filename_prefix": "video/stack5_kling",
"format": "auto",
"format.codec": "auto",
"video": [
"1225",
0
]
},
"_meta": {
"title": "Save Video"
}
},
"1228": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "stack1_nb",
"images": [
"1189",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"1229": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "stack2_nb",
"images": [
"1200",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"1231": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "stack3_nb",
"images": [
"1208",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"1233": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "stack4_nb",
"images": [
"1216",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"1235": {
"class_type": "SaveImage",
"inputs": {
"filename_prefix": "stack5_nb",
"images": [
"1224",
0
]
},
"_meta": {
"title": "Save Image"
}
},
"1206:1203": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"927:912",
0
],
"image2": [
"1206:1205",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"1206:1204": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"1209",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"1206:1205": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": 384,
"image": [
"1206:1204",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1080
},
"_meta": {
"title": "Resize Image v2"
}
},
"1214:1211": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"1206:1203",
0
],
"image2": [
"1214:1213",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"1214:1212": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"1217",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"1214:1213": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": 384,
"image": [
"1214:1212",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1080
},
"_meta": {
"title": "Resize Image v2"
}
},
"1222:1219": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"1214:1211",
0
],
"image2": [
"1222:1221",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
},
"1222:1220": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"1225",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"1222:1221": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": 384,
"image": [
"1222:1220",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1080
},
"_meta": {
"title": "Resize Image v2"
}
},
"925:1197": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": 384,
"image": [
"925:903",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1080
},
"_meta": {
"title": "Resize Image v2"
}
},
"925:903": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"1192",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"927:1198": {
"class_type": "ImageResizeKJv2",
"inputs": {
"crop_position": "center",
"device": "cpu",
"divisible_by": 2,
"height": 384,
"image": [
"927:904",
0
],
"keep_proportion": "crop",
"pad_color": "0, 0, 0",
"upscale_method": "lanczos",
"width": 1080
},
"_meta": {
"title": "Resize Image v2"
}
},
"927:904": {
"class_type": "GetVideoComponents",
"inputs": {
"video": [
"1201",
0
]
},
"_meta": {
"title": "Get Video Components"
}
},
"927:912": {
"class_type": "ImageStitch",
"inputs": {
"direction": "down",
"image1": [
"925:1197",
0
],
"image2": [
"927:1198",
0
],
"match_image_size": True,
"spacing_color": "white",
"spacing_width": 0
},
"_meta": {
"title": "Stitch Images"
}
}
})
# Replace each example.com URL with a public URL of your file.
workflow.set_input("41", "image", client.assets.from_url("https://example.com/replace-with-a-url/image"))
# run() also passes api_key to the partner nodes in this workflow.
job = client.run(workflow, api_key=api_key)常见问答
Yes. The KlingVideoNode requires valid credentials. Enter your API key or session token in the node’s settings (or environment, if supported by your install) before running the video stage.
It’s a preconfigured angle-synthesis group that takes your single input image and produces five alternate viewpoints to use as start frames for Kling 3.0. This helps you preview different angles without manually crafting separate inputs.
Yes. The workflow is set up for five branches by default. You can duplicate or remove a branch after the Reroute fan-out, then update the tiling/stacking inputs going into CreateVideo so the composite matches the new count. Angle spacing controls (if exposed) live inside the Nano Banana 2 group.
The compositor tiles the five Kling outputs into a portrait canvas for mobile/social viewing. If you prefer landscape, change the aspect/size in the CreateVideo node (author presets include 720p/2K/16:9). Ensure all branches feed the compositor at the same resolution.