Image Inset (CCN)
Drag and drop up to three images onto a base canvas
- image
- embed1
- embed2
- embed3
- compilation
- base
Compositing in ComfyUI usually means math: crop this, resize that, paste it at these coordinates with a paste node and a mask. Image Inset skips the arithmetic. It gives you a visual canvas on the node itself where you drag rectangles to place up to three images onto a base image, and it composites them for you. It's the kind of QoL node that makes you wonder why this isn't the default way to do it.
The source image is never modified - you get two outputs, compilation (the composited result) and base (the untouched source pass-through). Each embedded image gets its own rectangle on the canvas, color-coded (red, green, blue) so you always know which rect belongs to which embed. Connected embeds are scaled to fill their rectangle and pasted in order 1 → 3, so blue lands on top where they overlap. Disconnected embeds simply get no rectangle and are ignored.
The inputs that matter
- image - the base canvas. This is a normal image input: wire it in, or treat the node like a standard image loader and pick a file.
- embed1 / embed2 / embed3 - up to three images to paste onto the base. Wire any subset.
- lock_ratio - locks each embed to its incoming aspect ratio as you drag, so you can't accidentally squash a face into a different shape. Default on; turn it off for deliberate stretch.
- The
embed*_x1/y1/x2/y2fields - normalized 0–1 rectangle coordinates. You don't set these by hand; the canvas widget writes them as you drag. They're resolution-independent, so a layout you design at one base size scales cleanly to another.
There's also loaded_image (the file picker when nothing's wired) and a debug toggle. It reads the input directory and lists image files, same as the core Load Image node.
What to know before you love it
Two honest gotchas. First, like the pack's Cropped Image, the canvas operates on a copy stashed in ComfyUI's temp folder - fine for execution, but it's cleared on restart, so don't expect the preview to persist as state. Second, RGBA embeds have their alpha dropped rather than composited: masks and cutouts are explicitly out of scope for now. If you need transparency-aware compositing, this isn't the node; if you're placing rectangular refs or products on a backdrop, it's perfect.
The README's showcase uses it exactly that way: scrub a video for the perfect frame, crop a replacement image, inset it over the original, and prompt the model to replace one thing with another. That workflow - visual placement instead of coordinate math - is where Image Inset shines.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/valkymaera/ComfyCollectorNodes
restart, or ComfyUI Manager → ComfyCollectorNodes. The canvas widget is part of the pack's JS, so make sure you restart fully after install (hard refresh the browser too if the canvas doesn't render). No model files, no extra Python deps.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| lock_ratio | BOOLEAN | true | — |
| embed1_x1 | FLOAT | 0.05000–1 | — |
| embed1_y1 | FLOAT | 0.05000–1 | — |
| embed1_x2 | FLOAT | 0.33000–1 | — |
| embed1_y2 | FLOAT | 0.33000–1 | — |
| embed2_x1 | FLOAT | 0.36000–1 | — |
| embed2_y1 | FLOAT | 0.36000–1 | — |
| embed2_x2 | FLOAT | 0.64000–1 | — |
| embed2_y2 | FLOAT | 0.64000–1 | — |
| embed3_x1 | FLOAT | 0.67000–1 | — |
| embed3_y1 | FLOAT | 0.67000–1 | — |
| embed3_x2 | FLOAT | 0.95000–1 | — |
| embed3_y2 | FLOAT | 0.95000–1 | — |
| imageopt | IMAGE | — | |
| embed1opt | IMAGE | — | |
| embed2opt | IMAGE | — | |
| embed3opt | IMAGE | — | |
| loaded_imageopt | COMBO | 2 options: none, example.png | |
| debugopt | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| compilation | IMAGE | — |
| base | IMAGE | — |