NO8D-Image Composer
Stop bouncing to Photoshop just to lay out three images
- image
- width
- height
ComfyUI has never had a good answer to "I have four finished images and I want them arranged on one canvas." You either chain composite nodes with hand-typed coordinates until the graph looks like a switchboard, or you export everything and do it in Photoshop. NO8D-Image Composer is the second option, implemented inside the first one.
It's a freeform layer canvas - drag, scale, rotate, cut out, outline, blend - and it ships in the ComfyUI-NO8D-controls pack, which arrived mid-2026 from the author behind the Krea2 style library and the NO8D expression LoRAs. MIT-licensed, and unusually UI-heavy for a ComfyUI node.
What it actually does
Be honest about the framing: this is Pillow with a nice front end. No model, no latent - just the deterministic pixel layer where you place elements. That's the layer the KB's post-processing doc calls the ecosystem's most uneven one, and the reason people keep leaving ComfyUI for After Effects. The standing rule after any inpaint is "composite your image," and normally that means a paste node, a mask, and a color match. Or you're assembling a product shot, a before/after panel, a character sheet.
How it works, mechanically
The node on the canvas is a stub - a thumbnail, an Open Image Composer button, and a hidden layout_json string. Editing happens in a browser overlay, and the composition only exists as that JSON.
On run, execute() parses the JSON and rasterizes with Pillow. Canvas size comes from ratio and short_side (short side snapped to a multiple of 8, long side derived from the ratio, ceiling 16384 px). It makes an opaque black RGBA canvas, then walks layers bottom to top: scale, rotate, apply opacity, place by the layer's center, alpha-composite. multiply, screen and overlay are done in numpy. Then it converts to RGB and emits a normal IMAGE tensor.
Inputs and outputs
One input, and you should never type in it: layout_json (string, default {"ratio":"1:1","short_side":1024,"layers":[]}). The editor writes it, which is why the layout survives saving and reopening the workflow.
Three outputs. image is the finished composite - into SaveImage, an upscaler, or back into an inpaint sampler. width and height are ints for the canvas you composed on, handy for sizing an empty latent to match.
Two numbers worth knowing. The editor's short-side dropdown stops at 2048 while the backend accepts 8–16384, so a 4K composite means editing the JSON. And an empty layer list gives you a black rectangle of the correct size, not an error - so if the output is black, check that before blaming your VAE.
Driving the editor
Pick an aspect ratio (1:1 through 21:9) and a short side, then add images by picker, drag-and-drop, or paste. Space-drag pans, wheel zooms, and the canvas extends past the output frame while you work - intended, not a bug.
Per layer you can reorder, hide, lock, multi-select, move, scale, rotate, flip, set opacity, and choose a blend mode. V toggles visibility, Ctrl+L locks, Delete removes, arrows nudge 1 px (Shift+arrows, 10 px), and Ctrl+Z / Ctrl+Shift+Z step through 20 undo states.
Auto cutout runs rembg on the layer and is the only feature with a dependency. After a cutout you can add an outline (up to 40 px, any hex colour) or switch to the eraser and brush it back. Expect rembg quality - the defaults are u2net, which is where weak hair and semi-transparent edges come from. If a clean cutout is the whole reason you're here, BiRefNet is the better tool.
Then click Save layout. That's the step people skip. Undo history is 20 in-memory steps and dies with the editor window; close the overlay without saving and the composition is gone.
Install
ComfyUI Manager: search NO8D-controls and install. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/no8d/ComfyUI-NO8D-controls.git
cd ComfyUI-NO8D-controls
python -m pip install -r requirements.txt
Windows portable users run that pip line from the portable root with python_embeded\python.exe. The pack's requirements are only json-repair and openpyxl - prompt-expansion nodes and the XLSX prompt libraries respectively. Neither touches the composer, so there's nothing heavy to install for this node. Restart and hard-refresh the browser; no build step.
Cutout only, and into ComfyUI's Python: python -m pip install rembg.
Where people get burned
"rembg is not installed." You installed it into the wrong interpreter - it has to be the Python ComfyUI runs as.
The first cutout seems to hang. rembg builds a session and pulls weights on demand. One-time download, not a freeze.
Layers break after you move the workflow. Layer entries reference filenames inside ComfyUI's input directory - the code rejects absolute paths and anything that escapes that folder. Share the workflow, or clear your input dir, and you get a missing-file error. The layout travels in the workflow; the pixels don't.
The editor button does nothing. It's a browser overlay, so it inherits the frontend's problems - the KB's comfyui-ecosystem doc covers the Nodes 2.0 rendering breakage since late 2025. Try the legacy canvas before reinstalling anything.
And set one expectation correctly: this composes pixels you already have. It doesn't generate layers, and it won't make a pasted subject agree with its new background's light - that's color matching, still a separate node.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| layout_json | STRING | {"ratio":"1:1","short_side":1024,"layers":[]} | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| width | INT | — |
| height | INT | — |