A2V Multi Image Composite
The compositor that drops a desktop window into your ComfyUI graph
- background
- image1
- image2
- image3
- image4
- image5
- IMAGE
A2V Multi Image Composite is a node that lets you layer up to five images onto a background and move them around live - drag, scale, rotate, flip, reorder, and blend with your mouse instead of guessing numbers. ComfyUI's own approach to compositing is "type coordinates into the node," which is miserable when you're eyeballing where a logo sits or where a character's feet should land. This node replaces the guess-and-check with an interactive canvas.
Fair warning before you install: this is an obscure pack. The repo is a single upload with no release history, no stars, and no real community discussion anywhere I could find. It's not malicious as far as I can tell from reading the source - it's just a small utility someone built and published. That's the usual rule for tiny unknown nodes: read the code if you can, don't run it on a machine you care about, and don't build your whole workflow on it.
How it works
Under the hood it's OpenCV and PIL. Each image gets transformed with cv2.warpAffine (scale, rotation, flips, Lanczos resampling), then composited onto the background in layer order. If a source has an alpha channel, it's respected - rotating an RGBA image leaves transparent corners instead of black boxes, which is a nice touch for foreground elements.
When enable_preview is on (the default), the node opens native desktop windows - a preview, a control panel with trackbars, and a layers panel - and then blocks the entire workflow in a loop until you press ESC, ENTER, or Q. The mouse controls are: click to select a layer, drag to move, S/T toggles scale/rotate mode for the mouse wheel, H/V flip, B cycles blend modes, G shows a grid, C centers the layer. That loop is why this feels like a mini image editor grafted onto a node graph.
The inputs that matter
Only two inputs are required: background and image1. Images 2–5 are optional and come with the same eight controls each: x_pos/y_pos (−4096 to 4096), scale (0.1–10), rotation (−180 to 180), opacity (0–1), blend_mode (normal, multiply, screen, overlay), and flip_h/flip_v. Position is the one you'll actually set - it's the top-left corner of the layer on the background. enable_preview decides whether you get the interactive window or just a straight run.
The single output is IMAGE, and the node is marked as an output node, so you can wire it straight into a Save Image node.
The traps
Two things will bite you, both visible in the source.
First, the preview opens on the machine running ComfyUI, not in your browser. If ComfyUI runs on a remote box or a headless server, cv2.imshow has no display to draw on and the preview errors out. Run ComfyUI on a desktop with a real display, or set enable_preview to false and drive everything from the widgets - the node composites fine either way, you just lose the interactivity.
Second - and this one is sneaky - opacity and blend mode only affect the preview, not the saved output. The preview path renders with proper opacity and blending, but the final output pass uses a plain PIL paste, which bakes in scale, rotation, flips, and position only. Set a layer to 50% multiply in the preview, close it, and the exported image shows it at full opacity, normal blend. The preview is lying to you about those two settings. Adjust them in the widget values if you actually want them applied.
Also worth knowing: your interactive tweaks mutate state inside the running node, so the output reflects them, but nothing writes back to the widgets - the workflow JSON won't record what you did. Re-running resets everything to the input values.
Installing
ComfyUI Manager is the easy route - search "A2V Multi Image Composite" and install. Or, from ComfyUI/custom_nodes:
git clone https://github.com/aiartvn/A2V_Multi_Image_Composite
then restart ComfyUI. Dependencies are numpy, opencv-python, Pillow, and torch - and really only opencv-python is new to a stock install, since the other three are ComfyUI core. No model files, no API key, nothing to download.
Is it worth it? If you regularly drop logos, watermarks, or foreground layers onto generated images and hate typing coordinates, it's a nice experiment. If you just want predictable compositing you can reproduce later, reach for Image Composite or a simple PIL paste node instead - those don't freeze your workflow and don't lie about opacity.
Inputs (47)
| Name | Type | Default | Description |
|---|---|---|---|
| background | IMAGE | — | |
| image1 | IMAGE | — | |
| x_pos1 | INT | 0-4096–4096 | — |
| y_pos1 | INT | 0-4096–4096 | — |
| scale1 | FLOAT | 1.00.1–10 | — |
| rotation1 | FLOAT | 0-180–180 | — |
| opacity1 | FLOAT | 1.00–1 | — |
| blend_mode1 | COMBO | 4 options: normal, multiply, screen, overlay | |
| flip_h1 | BOOLEAN | false | — |
| flip_v1 | BOOLEAN | false | — |
| enable_preview | BOOLEAN | true | — |
| image2opt | IMAGE | — | |
| x_pos2opt | INT | 0-4096–4096 | — |
| y_pos2opt | INT | 0-4096–4096 | — |
| scale2opt | FLOAT | 1.00.1–10 | — |
| rotation2opt | FLOAT | 0-180–180 | — |
| opacity2opt | FLOAT | 1.00–1 | — |
| blend_mode2opt | COMBO | 4 options: normal, multiply, screen, overlay | |
| flip_h2opt | BOOLEAN | false | — |
| flip_v2opt | BOOLEAN | false | — |
| image3opt | IMAGE | — | |
| x_pos3opt | INT | 0-4096–4096 | — |
| y_pos3opt | INT | 0-4096–4096 | — |
| scale3opt | FLOAT | 1.00.1–10 | — |
| rotation3opt | FLOAT | 0-180–180 | — |
| opacity3opt | FLOAT | 1.00–1 | — |
| blend_mode3opt | COMBO | 4 options: normal, multiply, screen, overlay | |
| flip_h3opt | BOOLEAN | false | — |
| flip_v3opt | BOOLEAN | false | — |
| image4opt | IMAGE | — | |
| x_pos4opt | INT | 0-4096–4096 | — |
| y_pos4opt | INT | 0-4096–4096 | — |
| scale4opt | FLOAT | 1.00.1–10 | — |
| rotation4opt | FLOAT | 0-180–180 | — |
| opacity4opt | FLOAT | 1.00–1 | — |
| blend_mode4opt | COMBO | 4 options: normal, multiply, screen, overlay | |
| flip_h4opt | BOOLEAN | false | — |
| flip_v4opt | BOOLEAN | false | — |
| image5opt | IMAGE | — | |
| x_pos5opt | INT | 0-4096–4096 | — |
| y_pos5opt | INT | 0-4096–4096 | — |
| scale5opt | FLOAT | 1.00.1–10 | — |
| rotation5opt | FLOAT | 0-180–180 | — |
| opacity5opt | FLOAT | 1.00–1 | — |
| blend_mode5opt | COMBO | 4 options: normal, multiply, screen, overlay | |
| flip_h5opt | BOOLEAN | false | — |
| flip_v5opt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |