TileMerge (Legacy)
Stitching tiles together when you already know the final size
- images
- IMAGE
TileMerge (Legacy) is the merger that goes with the original SimpleTiles splitter: you give it the tile stack from TileSplit (Legacy) plus the final image dimensions, and it lays the tiles back down into one image, feathering the overlap so you don't get a grid of visible seams. It's the "paste" half of the pack's original cut-paste-sampler loop, and it does the job with an honesty the author is upfront about: it's simple, it works, and it's been superseded.
The one thing it makes you do that the dynamic nodes don't is supply the final size yourself. Where DynamicTileMerge reads the dimensions out of a TILE_CALC object, this node has explicit final_height and final_width inputs - which is exactly why the pack also ships TileCalc, to compute those numbers for you. If you're building new workflows, reach for DynamicTileMerge; keep this one for old workflows and the specific case where you want to hard-code the output size.
How it works
It takes the tile size from the incoming tensor, and from final_height/final_width it computes how many rows and columns of tiles the grid must have had, using the same step logic as the splitter. Then it places tiles in a specific order: farthest from the center first, center last. Each new tile is feathered over a blend-pixel band, with edge weights ramping linearly from 0 to 1 - but only where a previous tile already covers the region, so the first tile sits flat and only overlaps get blended. Because the center tile lands last, the middle of the image ends up on top at full strength.
Same overlap convention as TileSplit (Legacy): overlap_x is what you type, overlap_y is scaled by the tile aspect ratio (int(overlap × tile_height / tile_width)). Both nodes use it, so the numbers line up as long as you keep them identical.
The inputs
- images: the tile stack from TileSplit (Legacy), after your sampler.
- overlap: must match what you used in TileSplit. Get this wrong and the tiles won't line up with the grid the splitter cut.
- blend (default 64): the feather width. The README rule: blend must be less than overlap, or the ramp never reaches full weight inside the overlap and you'll see seams. Defaults are safe together.
- final_height / final_width: the output dimensions. These are what you get from TileCalc (or work out yourself) - and they should match the source image's size after you scale it, or the tiles won't fill the canvas.
Output
A single IMAGE at final_height × final_width, ready for a Save Image / Preview node.
Installing it
Part of the SimpleTiles pack. ComfyUI Manager → search SimpleTiles, or:
cd ComfyUI/custom_nodes
git clone https://github.com/kinfolk0117/ComfyUI_SimpleTiles
Restart ComfyUI. No dependencies beyond PyTorch, no model downloads. Shows up under utils.
Common issues
- Seams in the output.
blendat or aboveoverlap, or the overlap values in split and merge don't match. - Tiles don't fill the frame.
final_width/final_heightdon't match the grid the splitter actually produced (usually because the source image didn't divide evenly and TileSplit dropped an edge row - the legacy nodes' classic failure mode). Run the numbers through TileCalc and make sure the source is scaled to divide cleanly. - It's legacy for a reason. The dynamic nodes replaced this pair because they compute everything internally. On mismatched aspect ratios the legacy merge silently produces the wrong layout; DynamicTileSplit/DynamicTileMerge handle those cases correctly.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| overlap | INT | 640–4096 | — |
| blend | INT | 640–4096 | — |
| final_height | INT | 20480–36864 | — |
| final_width | INT | 20480–36864 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |