Comic Page Composer
From a pile of panels to finished pages — with pixel coordinates to prove it
- generated_panels
- comic_script
- composed_pages
- panel_bboxes_json
- individual_panels
By the time ComicBatchGenerator is done, you've got a flat stack of panel images and the script that describes them. Comic Page Composer is what turns that pile into actual pages. It takes the generated panel images, cuts each one to its panel's exact bounding box, and places them onto page-sized canvases according to the layout in the script - so far that means vertical_stack, one panel after another, with gutters, bleed, alignment, and borders all defined in the JSON. It's the last node in the standard chain: Loader → Batch Generator → this.
The inputs
Three, all required: generated_panels (the IMAGE batch out of the generator), comic_script (the same COMIC_SCRIPT object), and debug_overlay (a boolean, default off). One honest gotcha: debug_overlay is currently a placeholder. The README lists debug overlay under "Not yet supported" (slated for M5), and the source accepts the toggle but doesn't act on it yet - so don't flip it expecting to see panel boundaries drawn. It's a promise for a later release.
What you get out
Three outputs:
- composed_pages (IMAGE) - the finished pages, padded to a uniform size so ComfyUI can batch them. Wire this into a Save Image or preview.
- panel_bboxes_json (STRING) - a JSON document with every page's dimensions and every panel's top-left corner, size, and shape type. This is the quiet star of the node: exact per-panel pixel coordinates are precisely what a lettering or word-balloon pass needs. The pack doesn't render text itself in M1, but the bboxes make the handoff clean.
- individual_panels (IMAGE) - the input panel stack passed straight through, so you can save raw panels alongside composed pages if you want both.
The gotchas
The composer trusts the script's panel order and sizes absolutely. It walks the pages in order and crops each incoming image to that panel's bbox - from the top-left of the padded image, which matches how the generator padded everything. If an incoming image is smaller than the bbox it expects, it raises an error naming the offending page and panel. That almost always means you fed it panels generated from a different script than the one it's composing against, so keep the comic_script wire honest - don't route one script's panels through another script's composer. Borders, by the way, aren't widget settings; they come from the script (default_border plus per-panel border), drawn by the composer from the JSON's hex colors.
Install
Same pack, same steps as its siblings:
cd ComfyUI/custom_nodes
git clone https://github.com/tackcrypto1031/tk_comfyui_comic_tool.git
cd tk_comfyui_comic_tool
pip install Pillow jsonschema numpy
or via ComfyUI Manager (search the pack title "tk_comfyui_batch_image"), then restart. You'll find it under comic/io. No models to download; just Pillow, jsonschema, and numpy.
The honest take
This is the least glamorous node in the pack and the one you'll be happiest to have. Hand-compositing panels in Photoshop is exactly the kind of "prompting is only a third of the work" cleanup the community's most-cited comic workflows complain about - and the layout part of that grind is what this node removes. Just know the boundaries: M1 supports rectangle panels and vertical stacks only. Diagonal split panels and arbitrary polygons are on the roadmap (M3/M4), so if your comic needs dynamic layouts yet, you'll still be doing some manual assembly. For a webtoon-style vertical scroll, it does the whole job.
Troubleshooting
- "panel X.Y: incoming image shape … smaller than required" - script/panel mismatch (see above). Re-run the generator with the same script you're composing against.
- Pages come out with white edges - that's the padding to a uniform size so the pages stack as one batch; the page content is intact. Crop in a Save node or downstream.
- Borders look wrong or missing - border settings come from the JSON, not the node. Edit
default_borderor the panel'sborderin the script.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| generated_panels | IMAGE | — | |
| comic_script | COMIC_SCRIPT | — | |
| debug_overlay | BOOLEAN | false | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| composed_pages | IMAGE | — |
| panel_bboxes_json | STRING | — |
| individual_panels | IMAGE | — |