Image Batch Join With Transition (Swwan)
Slide, wipe or iris between two clips
- images_1
- images_2
- IMAGE
A real transition, not a dissolve
Cross Fade Images dissolves. This node wipes: the boundary between clip A and clip B sweeps across the frame - horizontally, vertically, as a growing box, as an expanding circle, as a pair of doors, or as a plain fade. If you've ever wanted a circle iris between two generated shots without opening a compositor, this is it.
KJNodes' ImageBatchJoinWithTransition under a Swwan ID, and it's the most capable node in the pack's transition group - which is also why every knob on it matters.
How the wipe works
For each blended frame the node builds a mask rather than mixing whole images: the shape's edge is placed according to the eased alpha, and then the frame is images_1 * (1 - mask) + images_2 * mask. Same maths as a cross fade, different mask. horizontal slide fills the mask from the left, vertical slide from the top, box grows a centred rectangle, circle grows a radius from the centre, the two door modes fill bars in from both edges, and fade just sets the mask to alpha everywhere - which is the dissolve you'd get from the other node.
blur_radius (0 to 100, default 0) Gaussian-blurs that mask before it's applied, which is the soft-edge feather. A couple of pixels of blur turns a hard-edged wipe into something that reads as motion rather than a cut.
And interpolation shapes the timing of the sweep: linear moves at a constant rate, ease_in_out starts slow, accelerates, and settles, and the hyperbolic ones (bounce, elastic, glitchy) wobble. On a wipe, timing is most of the perceived polish.
Inputs and output
Required: images_1, images_2, start_index, interpolation, transition_type, transitioning_frames, blur_radius, reverse, device. That's the full required list, and all of them are widgets - only the two batches are wires.
start_index- default 0, and it can go negative:-10000to10000. It's where inimages_1the transition begins. Negative values count back from the end.transitioning_frames- default 1, minimum 1. How long the wipe lasts.reverse- swaps which clip is treated as the one being transitioned from, both in the timing and inside the wipe maths.device-CPUorGPU, defaultCPU. With GPU, each frame pair is moved to the device for the wipe and moved back, then the whole result is stacked on CPU.
Output: a single IMAGE containing images_1[:start_index], the blended frames, and the remainder of images_2.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/aining2022/ComfyUI_Swwan
cd ComfyUI_Swwan
python -m pip install -r requirements.txt
Manager → ComfyUI Swwan, restart and hard-refresh. No models, no optional packages - it's tensor masking, with an optional GPU hop for speed.
Where it bites
The transition can be shorter than you asked. The number of blended frames is the minimum of transitioning_frames, the frames left in clip A after start_index, and the length of clip B. Ask for 24 frames when clip B only has 12 and you get 12, no warning. Check your clip lengths first - Get Image Range From Batch and the size/count nodes are there for exactly that.
Both batches must be non-empty - Both input batches must have at least one image is the error - and the frames need matching dimensions, since the blend is element-wise. Cross-fading a 720p clip into a 1080p one needs a resize first.
start_index out of range raises, rather than clamping. start_index = -10000 on a 60-frame clip is the same as -60 is the same as 0; anything past that is an error you'll have to read.
Blur is applied per frame, on the whole mask. A large blur_radius at low transitioning_frames gives you a wipe that's mostly blur and barely a wipe - if it looks mushy, cut the blur and extend the frame count instead. And unlike the pack's cross-fade node, this one always produces a visible transition: at transitioning_frames = 1 you get a single hard-edged frame, which is a legitimate cut-with-a-chip of the wipe, not a no-op.
One last thing: it's a wipe of whole frames, not a moving subject. Nothing here tracks content, so a horizontal slide on two unrelated clips looks like a PowerPoint transition - which is fine, and occasionally exactly the energy you want.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| images_1 | IMAGE | — | |
| images_2 | IMAGE | — | |
| start_index | INT | 0-10000–10000 | — |
| interpolation | COMBO | 8 options: linear, ease_in, ease_out, ease_in_out, bounce, elastic, +2 | |
| transition_type | COMBO | 7 options: horizontal slide, vertical slide, box, circle, horizontal door, vertical door, +1 | |
| transitioning_frames | INT | 11–4096 | — |
| blur_radius | FLOAT | 0.00–100 | — |
| reverse | BOOLEAN | false | — |
| device | COMBO | CPU | 2 options: CPU, GPU |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |