Merge Image Tile
Stitch a processed tile back with seamless blending
- image
- layout
- tile
- image
The other half of the split/merge pair. After you've extracted a tile, sampled or upscaled it, ETN_MergeImageTile drops it back into the full image at the right spot - and, crucially, blends the overlap so you don't get grid lines. It's the "put it back together" primitive in Acly's tooling-nodes tiling set, the node that turns a pile of separately-processed tiles into one clean picture.
The seam-hiding is the entire value here. Anyone can crop and paste tiles; the hard part of tiled upscaling is making the boundaries invisible, because "skipping the blend" is one of the classic ways a tiled upscale ends up looking like a patchwork quilt. This node uses the padding-and-blending values baked into your layout to feather each tile into its neighbors.
How it works
You call it once per tile. It takes the full image so far, the layout, the tile index, and the processed tile, and it composites that tile into position using "a smooth transition overlap between neighbouring tiles depending on padding and blending values" (README). Where two tiles overlap, it cross-fades them across the blend zone instead of hard-cutting, so adjacent tiles melt together.
Because it takes the image and returns the image, you chain merges: feed the output of one merge as the image input of the next, accumulating tiles one at a time until the frame is complete. Indices are column-major, same as extraction - tile 1 is below tile 0 - so keep your extract and merge loops on the same indexing and they line up automatically.
The inputs and outputs that matter
image(IMAGE) - the canvas you're merging into. On the first merge this is typically your upscaled base; on each subsequent merge it's the running result from the previous merge.layout(TileLayout) - the same grid from ETN_TileLayout. Must match what you extracted with.index(INT, default0, min0) - which tile position this is, column-major. Pair it with the index you extracted.tile(IMAGE) - the processed tile to place. This is the output of your per-tile sampling/upscaling chain.
Output:
image(IMAGE) - the image with this tile merged in. Feed it forward into the next merge, or save it once every tile is placed.
How to install it
Install the pack once. ComfyUI Manager: search ComfyUI Nodes for External Tooling, install, restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/Acly/comfyui-tooling-nodes.git
then restart. No downloads - it's compositing math.
Common issues & troubleshooting
Visible seams or grid lines. The blend width comes from your layout's padding and blending. If seams show, go back to Create Tile Layout and increase those - a wider feather zone hides more. Also confirm every merge uses the same layout object; mismatched layouts can't blend correctly.
Tiles land in the wrong place. Index mismatch. Extraction and merging are both column-major (tile 1 below tile 0). If you re-mapped indices anywhere in between, undo that - keep one consistent order end to end.
A tile's edges look duplicated or doubled. You probably cropped the padding off the tile after extraction. The overlap padding has to survive the round trip for the blend to work; process the tile at the size you extracted it and let this node handle the overlap.
Divergent tiles that don't match at the seams. Blending can't fix content that genuinely disagrees across the boundary. If neighboring tiles drifted during sampling, condition each on the source (ControlNet Tile) so they stay consistent - the KB flags this as the reliable fix for tiled upscales.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| layout | TileLayout | — | |
| index | INT | 0 | — |
| tile | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |