Image Blend Grid (QQ)
A storyboard your video model can actually read
- enable_grid
- frames
- selected_grid
Image Blend Grid renders nothing. No image input, no image output, and bypassing it changes no pixels. It's a settings node: four widgets packed into an object that a different node knows how to read.
What it is, and why it exists
It's plumbing - a GRID_CONFIG, a dict of enable, horizontal, vertical and frames - and exactly one node consumes it: Image Blend GPU Advanced, from the same pack, through its optional enable_grid input. In grid mode that node stops handing you plain composited frames and gives you, for each frame, a grid built out of the frames around it.
Why bother: Wan and VACE-style conditioning comes down to what the model can see while it generates, and a lookahead view of the shot beats a single still. Reach for this for multi-frame reference conditioning you want on rails; single-image I2V gains nothing.
How the grid is built
Source frames are normalized to exactly frames long - last frame duplicated if the clip is short, truncated if it's long. Cell size is src_width // columns, with cell height derived from the source aspect ratio so cells keep the background's proportions; the canvas fits the grid block exactly, with no empty margins.
The clever bit: one grid is built per output frame. For frame t, cell 0 is frame t itself, the final cell is pinned to the clip's last frame, and the cells between spread evenly across what's left. As t advances the window telescopes forward and clamps, until every cell has collapsed onto the final frame: current frame first, then a progressively denser "here's where we're going."
The mask is dumber: one white cell, picked by horizontal/vertical, black everywhere else, identical on every frame. Feed it to a VACE-style control mask and the marked cell is the region the model works on while the rest of the grid is reference.
The four widgets, and the two outputs
enable is the switch and defaults to "false", so a freshly dropped node does nothing until you pick 2x2, 3x2 or 3x3. Read those as columns × rows: 3x2 is three across, two down, six cells.
horizontal and vertical (left/middle/right, top/middle/bottom) pick which cell the mask marks. On an even axis "middle" is columns // 2, so a 2-wide grid gives you the second column, not a center that doesn't exist.
frames is the one that bites: default 22, min 5, step 17. Set it to the length your clip will actually be - the grid normalizes to this number, so getting it wrong means duplicated tail frames or a truncated clip.
Outputs: enable_grid is the GRID_CONFIG you wire into Image Blend GPU Advanced's enable_grid; frames is the same number as a plain INT, handy for feeding a length input so grid and sampler agree without maintaining the number twice.
Installing it
Manager, search ComfyUI-SA-Nodes-QQ, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/siraxe/ComfyUI-SA-Nodes-QQ
# restart ComfyUI
Mind the name churn: this pack was ComfyUI-WanVideoWrapper_QQ, and before that wanwrapper_qq, and the README still prints the old URL. If a wanwrapper_qq folder is in custom_nodes, delete it - old workflows reference that name and Manager will reinstall it as "missing nodes".
requirements.txt is empty (zero bytes) and there's no install.py, so nothing gets pip-installed for you. The pack hard-imports cv2 at the top of nodes/image_nodes.py - this node's own file - and the vendored MatAnyone2 code wants omegaconf. If the whole pack is missing from your node list after a restart, that's an import error: look for No module named 'cv2' and run pip install opencv-python. No model files needed for this node.
Where people get tripped up
- Nothing happens.
enableis"false"by default and the companion node skips the grid when it reads that. Pick a layout first. - The wire goes nowhere.
GRID_CONFIGis pack-private; Image Blend GPU Advanced is its only consumer. - Odd dimensions. Three columns of an 832px source gives 277px cells and an 831px canvas - not divisible by 32, and video VAEs complain. That's what the companion node's
resize_to_32is for, and grid mode runs before it, plushigh_MP/low_MP.3x2also shifts your aspect (full width, two-thirds height);2x2and3x3stay roughly source-shaped. - Drag-and-drop breaks. Another node here patches ComfyUI's drag-and-drop for video loading - opt-in now, but the suspect if your canvas stops taking drops.
- No example workflow. The repo ships none for the grid path, so the docstring and the log line (
[INFO] Grid '2x2': sliding per-frame grid, 4 cells of ...) are your documentation - it prints layout, canvas size and the marked cell.
Verdict: niche, near-zero community footprint, early-adopter territory - but the sliding storyboard is a real mechanism, and nothing else here gives it to you in four widgets and one wire.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| enable | COMBO | false | 6 options: false, 2x1, 1x2, 2x2, 3x2, 3x3 |
| horizontal | COMBO | left | 3 options: left, middle, right |
| vertical | COMBO | top | 3 options: top, middle, bottom |
| frames | INT | 221–1000000 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| enable_grid | GRID_CONFIG | — |
| frames | INT | — |
| selected_grid | STRING | — |