Nodes/ComfyUI Frame Maker/πŸ…“ Frame Maker
ComfyUI Node

πŸ…“ Frame Maker

Pan and zoom a subject into animation keyframes β€” no model, no API

By diStyAppsΒ·Created 2 years agoΒ·Updated 2 years agoΒ· 23
πŸ…“ Frame Maker
  • subject_image
  • subject_alpha
  • bg1
  • bg2
  • bg3
  • bg4
  • frames
  • frames
  • subject_image
  • width
  • height
  • frame_count
β—„frame_count4β–Ί
β—„invert_alphafalseβ–Ί
β—„movement_presetsleft to centerβ–Ί
β—„movement_presets_distance50β–Ί
β—„movement_directionbackβ–Ί
β—„x_pos_start0β–Ί
β—„x_pos_end0β–Ί
β—„y_pos_start0β–Ί
β—„y_pos_end0β–Ί
β—„scale_start1.00β–Ί
β—„scale_end1.00β–Ί
β—„scale_anchor_pointβ–Ύβ–Ί
β—„resize_frame_inputtrueβ–Ί
β—„frame_input_width768β–Ί
β—„frame_input_height768β–Ί
β—„resize_frame_outputfalseβ–Ί
β—„frame_output_width512β–Ί
β—„frame_output_height512β–Ί
β—„invert_orderfalseβ–Ί

The name makes it sound like it renders frames. It doesn't. FrameMaker is a compositor: it takes one subject image, pastes it over a background, and moves and scales it across frame_count steps to emit a batch of keyframes. No diffusion model involved, no weights to download, no API key, nothing running on your GPU - just PIL doing pan/zoom math while your VRAM sits idle.

It exists because animation in ComfyUI needs starting points. You can't get coherent motion from a single still, and hand-placing a character frame by frame is misery. FrameMaker generates the keyframes instead: you get a clean camera move (or subject move) on a transparent or cut-out subject, then hand those frames to something that adds motion - AnimateDiff with SparseCtrl, LayerDiffusion, or a frame-interpolator like RIFE VFI before VHS_VideoCombine turns the batch into a clip. That's exactly the pipeline diSty (diStyR on Reddit) built it for - his "splash" guided-motion workflow - and it's the shape to keep in your head when you wire this up.

How it works

Mechanically it's simple and old-school: your subject_image is converted to PIL, optionally joined with subject_alpha into an RGBA matte, and pasted onto a background at a position that linearly interpolates from x_pos_start/y_pos_start to x_pos_end/y_pos_end across frame_count frames. Scale does the same from scale_start to scale_end. That's the whole trick.

Two things quietly override your manual values, and both are in the source:

  • movement_presets (25 of them, "left to center", "center to right", diagonals, the lot) replace x_pos_start/end and y_pos_start/end when it isn't None. movement_presets_distance is a percentage of the image dimensions, default 50 - so on a 768px canvas that's 384px of travel.
  • movement_direction replaces your scale values outright: front sets scale 0.3 β†’ 1.3 (subject grows toward camera), back sets 1.3 β†’ 0.3. Set it to None if you want scale_start/scale_end to actually mean something.

scale_anchor_point (center, corners, top/bottom center) controls where the scaling pivots, and the optional bg1–bg4 backgrounds cycle frame by frame - handy for a multi-shot clip. Connect the frames input and it ignores the backgrounds entirely, using those frames instead. invert_order flips the output batch, which is a free reverse-play.

The inputs that matter

A beginner really sets about four things, everything else defaults sensibly:

  • subject_image - your character/object, ideally already cut out.
  • frame_count - 4 is the default and it's a good keyframe count; you'll interpolate up later.
  • movement_presets + movement_presets_distance - the easiest way to get a clean pan.
  • invert_alpha - flips the alpha matte; if your subject renders as a see-through ghost or a block, flip it.

Outputs are the money shot: frames (the IMAGE batch - wire it into your sampler, VFI, or video combine), plus subject_image, width, height, and frame_count ints for downstream sizing.

Install

The pack ships no requirements.txt and downloads no models - this is the rare custom node that's genuinely light.

cd ComfyUI/custom_nodes
git clone https://github.com/diStyApps/ComfyUI_FrameMaker
# restart ComfyUI

Or just use ComfyUI Manager and search "Frame Maker" - that's the recommended path in the README, and Manager will keep it updated.

Troubleshooting

  • frame_count of 1 crashes - the interpolation divides by frame_count - 1, so a single frame is a divide-by-zero. Keep it at 2 or more.
  • Your scale values get ignored - movement_direction is set to front or back. Set it to None.
  • Your x/y positions get ignored - a movement preset is overriding them. Set movement_presets to None.
  • Subject looks like a hole - flip invert_alpha.
  • Output is 768Γ—768 no matter what you loaded - resize_frame_input defaults to true and forces everything to frame_input_width/frame_input_height (768). If you want your real resolution, either change those or set resize_frame_input to false and keep subject and background the same size so the paste math lines up.
CategoryπŸ…“ diSty/FrameMaker

Inputs (26)

NameTypeDefaultDescription
subject_imageIMAGEβ€”
frame_countINT4β€”
invert_alphaCOMBOfalse2 options: true, false
movement_presetsCOMBOleft to center25 options: None, left to center, right to center, center to left, center to right, left to right, +19
movement_presets_distanceINT50-10000–10000β€”
movement_directionCOMBOback3 options: None, front, back
x_pos_startINT0-10000–10000β€”
x_pos_endINT0-10000–10000β€”
y_pos_startINT0-10000–10000β€”
y_pos_endINT0-10000–10000β€”
scale_startFLOAT1.000.05–10β€”
scale_endFLOAT1.000.05–10β€”
scale_anchor_pointCOMBO7 options: center, top center, bottom center, top left, top right, bottom left, +1
subject_alphaoptMASKβ€”
bg1optIMAGEβ€”
bg2optIMAGEβ€”
bg3optIMAGEβ€”
bg4optIMAGEβ€”
framesoptIMAGEβ€”
resize_frame_inputoptCOMBOtrue2 options: true, false
frame_input_widthoptINT76816–8192β€”
frame_input_heightoptINT76816–8192β€”
resize_frame_outputoptCOMBOfalse2 options: true, false
frame_output_widthoptINT51216–8192β€”
frame_output_heightoptINT51216–8192β€”
invert_orderoptCOMBOfalse2 options: true, false

Outputs (5)

NameTypeDescription
framesIMAGEβ€”
subject_imageIMAGEβ€”
widthINTβ€”
heightINTβ€”
frame_countINTβ€”