๐ผ๐น๐จ Reassemble Image/Video Grid
Stitch a split grid back together
- original
- part_1
- part_2
- part_3
- part_4
- part_5
- part_6
- part_7
- part_8
- part_9
- MODIFIED_part
- image
This one only makes sense once you know its other half: Split Image/Video Grid, another node in the same pack, chops a single image (or video) into a grid of pieces - say a 3x3 board of separate images. Reassemble Image/Video Grid does the reverse: takes those pieces back and glues them into one image again. The reason you'd ever want to do this round trip is the interesting part. If you've got a frame with three characters standing side by side and you need to lip-sync just one of them, splitting the grid lets you isolate that person's tile, run your lip-sync node on it alone, and then reassemble the whole frame with only that tile changed. Same trick works for saving VRAM - process just the region you care about instead of the whole image.
How it works
You feed it the original image (mostly as a size/shape reference) plus the rows and columns you used when splitting - these have to match, since the node needs to know the grid dimensions to know where each piece goes. Then you plug the individual tiles back in as part_1 through part_9 (the pack tops out at a 3x3, effectively - nine numbered slots). It stitches them into one output image.
The genuinely clever bit is the MODIFIED_part / MODIFIED_part_index pair. Instead of rewiring your edited tile directly into whichever part_N slot it belongs in, you plug it into MODIFIED_part and just set MODIFIED_part_index to the number of the cell it replaces. Want to compare which cell you're editing without tearing up your node graph each time? Change the index, not the wiring. It's a small thing, but it's the kind of detail that tells you the author actually uses this in production rather than just shipping a tech demo.
reference_video_part_index exists for the video case - when your "images" are actually lists of frames, it tells the node which part to treat as the reference for things like frame count. And auto_resize (on by default) quietly fixes up pieces that don't line up perfectly so the reassembly doesn't leave visible seams.
The inputs and outputs that matter
original(IMAGE) - the reference image; mostly used for sizing.rows/columns(INT, 1โ10) - must match what you used to split the grid in the first place.part_1โฆpart_9(IMAGE, optional) - your individual tiles, wired in by position.MODIFIED_part+MODIFIED_part_index(optional) - a shortcut slot for whichever tile you're actively editing, so you can flip which cell it targets without rewiring.- Output:
image- the reassembled grid.
How to install it
Via ComfyUI Manager: search Bjornulf_custom_nodes, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/justUmen/Bjornulf_custom_nodes
cd Bjornulf_custom_nodes && pip install -r requirements.txt
then restart ComfyUI. This node itself doesn't need anything exotic, but requirements.txt is shared across all 170-odd nodes in the pack (opencv-python, ffmpeg-python, ollama, and so on), so the install pulls in more than this one node strictly needs - normal for a Swiss-army-knife pack like this one.
Common issues & troubleshooting
Mismatched rows/columns. The single most likely way to get a garbled reassembly is passing different rows/columns values than you used on the split side - the node has no way to detect that on its own, so double-check the two nodes agree before you chase a "bug" that's really just a typo.
Seams or misalignment. If your edited tile came out of an external tool at a slightly different resolution than the original cell, leave auto_resize on - it's the node quietly absorbing that mismatch. Turn it off only if you specifically need pixel-exact placement and you've already made sure every tile is the right size.
This pack ships fast and breaks things. The README for Bjornulf_custom_nodes flags itself as "very active development, work in progress," and the changelog is full of breaking changes across its 170+ nodes. If an update to the pack suddenly changes how this node behaves, check the changelog before assuming you broke your own workflow.
Inputs (16)
| Name | Type | Default | Description |
|---|---|---|---|
| original | IMAGE | โ | |
| rows | INT | 11โ10 | โ |
| columns | INT | 11โ10 | โ |
| part_1opt | IMAGE | โ | |
| part_2opt | IMAGE | โ | |
| part_3opt | IMAGE | โ | |
| part_4opt | IMAGE | โ | |
| part_5opt | IMAGE | โ | |
| part_6opt | IMAGE | โ | |
| part_7opt | IMAGE | โ | |
| part_8opt | IMAGE | โ | |
| part_9opt | IMAGE | โ | |
| MODIFIED_partopt | IMAGE | โ | |
| MODIFIED_part_indexopt | INT | 00โ9 | โ |
| reference_video_part_indexopt | INT | 00โ9 | โ |
| auto_resizeopt | BOOLEAN | true | โ |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | โ |