Easy2DDeforum (Chan)
Deforum-style animation with no keyframes
- model
- vae
- positive
- negative
- image
- IMAGE
The name is honest: this is the Easy Deforum for ComfyUI. Real Deforum gives you a keyframe curve editor for every parameter and a wall of settings; Easy2DDeforum gives you one node, one camera move, and a denoise ramp. You drop in a single image, it runs per-frame img2img while slowly pushing the camera, and hands back a stack of frames ready for a video encoder. That's the whole deal.
If you're new to the term: Deforum is the A1111-era animation extension from 2022 - zoom and morph transitions on a single image, not real motion. There's no temporal coherence, no character tracking, no "the subject stays the same person across the clip" magic. That's by design. It's a dreamy camera-drift hallucination machine, and it still has a use: trippy zoom/pan background loops, music visualizer fodder, transitions between scenes. Later tools (AnimateDiff, then Wan) genuinely moved past it for motion, but the look is its own thing, and this is the most stripped-down way to get it in ComfyUI.
How it works
The loop is straightforward, and it's all there in main.py. For each of frame iterations it:
- Transforms the current image with your
x,y,zoom, andangle- a constant push, same every frame. - VAE-encodes it, prepares fresh noise with
seed + i, and runs the sampler (yoursteps,cfg,sampler_name,scheduler) at a per-framedenoise. - Decodes the result and feeds it back as the next frame's input.
The only thing that actually animates is the denoise strength: it ramps from denoise_min to denoise_max following your easing_type curve. The camera values are fixed - that's the simplification, and the "easy" part. Real Deforum keyframes everything; this gives you one linear push and a shaped ramp.
Output is a single IMAGE tensor with frame images stacked on the batch dimension. Wire that into VHS (VideoHelperSuite) → Save Video to get an mp4. One quirk from the source: if the input image's size happens to match the last generated frame's, the original input gets prepended to the output - usually it doesn't, and the node drops it.
The inputs that actually matter
Everything else is standard ComfyUI sampler plumbing, so really learn these:
frame- how many frames to generate. 16 is a good start; remember this is 16 full img2img passes, so it's slow.x,y,zoom,angle- the camera per frame. Defaults tell you the intent:zoom 0.98is a 2% zoom-in every frame (about 28% over a 16-frame clip),angle -1is a slow counterclockwise roll. Set all to identity and it just pulses with denoise.denoise_min/denoise_max- the start and end of the strength ramp. Keep the gap small (0.4 → 0.6 is sane) or the tail turns into mush.easing_type- the curve the ramp follows. 22 options from Linear through Sine, Quart, Elastic, Bounce.
Installing it
There's no requirements.txt and no model downloads - the node only uses ComfyUI's own sampler machinery plus torch/PIL/numpy, so install is trivial:
- ComfyUI Manager: search "ComfyUI-EasyDeforum", install, restart.
- Manual:
cd ComfyUI/custom_nodes && git clone https://github.com/Chan-0312/ComfyUI-EasyDeforum, then restart.
The node appears under the easyDeforum category, listed as "Easy2DDeforum (Chan)".
Where people get burned
- No keyframing. One constant camera push for the whole clip. If you want per-axis motion curves or masks, the XmYx
deforum-comfy-nodesport (from the Deforum authors) is the full-featured alternative; this pack is explicitly the early, simplified take. - Python version. One user reported example workflows failing to load on Python 3.11.6 while the repo suggests 3.10. If your ComfyUI is on 3.11+, don't be surprised if the bundled workflows don't open - the node itself usually still runs.
- The ramp can invert. Set
denoise_minhigher thandenoise_maxand the clip runs backward in strength. Both are 0–1, and it's an easy slip. - Character consistency is a non-goal. Per-frame fresh noise plus img2img means faces wander. Use it for atmosphere, not storyboards.
For 2D camera drift and dream loops it's a fun single-node drop-in - just don't ask it to be AnimateDiff.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| image | IMAGE | — | |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 8.00–100 | — |
| sampler_name | COMBO | 34 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +28 | |
| scheduler | COMBO | 9 options: normal, karras, exponential, sgm_uniform, simple, ddim_uniform, +3 | |
| frame | INT | 16 | — |
| x | INT | 15-4096–4096 | — |
| y | INT | 0-4096–4096 | — |
| zoom | FLOAT | 0.98 | — |
| angle | INT | -1-360–360 | — |
| denoise_min | FLOAT | 0.400–1 | — |
| denoise_max | FLOAT | 0.600–1 | — |
| easing_type | COMBO | 22 options: Linear, Sine In, Sine Out, Sine In/Out, Quart In, Quart Out, +16 |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |