Create Tile Layout
Define a tiling grid you build the rest of the workflow around
- image
- layout
Splitting an image into tiles, sampling each one, and stitching them back is how you upscale to print sizes on a GPU that can't hold the full frame - the standard "arbitrary output size on 6GB" trick. Most packs give you a fixed tiling pipeline (Ultimate SD Upscale, Tiled Diffusion) that does the whole thing in one node. Acly's tooling-nodes take the opposite bet: they hand you the raw pieces - split, mask, merge - and let you build the pipeline. ETN_TileLayout is the piece that defines the grid everything else references.
The payoff of the low-level approach, straight from the README: because you only get the split/merge primitives, "with tools and scripts it is feasible to generate individual workflows for each tile" - different prompts, different regions, different control per tile. That flexibility is the whole reason to reach for these instead of a canned upscaler, and it's the kind of programmatic control the pack exists to enable.
How it works
You feed it your image plus a few sizing parameters, and it computes a tile layout - how many tiles, where each one sits, how much they overlap. It doesn't cut the image; it just produces a TileLayout object that the Extract, Merge, and Generate-Mask nodes all consume. The README gives the tile count as roughly image_size // (min_tile_size + 2 * padding), so bigger padding or bigger minimum tiles means fewer, larger tiles.
The key idea is overlap. Tiles share a padding border with their neighbors, and a portion of that border is used for smooth blending so the seams disappear when you merge. Get this right and a tiled upscale looks like one image; get it wrong and you see grid lines.
The inputs and outputs that matter
image(IMAGE) - the image you're going to tile. The layout is computed from its dimensions.min_tile_size(INT, default512) - the smallest each tile can be, in pixels. Tiles may come out larger to divide the image evenly. Set this near your model's comfortable resolution.padding(INT, default32) - how many pixels each tile overlaps its neighbors. More overlap = safer blends but more compute (tiles are bigger and there are effectively more overlapping pixels). No padding is added at the image borders.blending(INT, default8) - the slice of the padding used for the smooth transition. This is what actually feathers the seams, and it feeds the masks the other tile nodes generate.multiple(INT, default8) - keeps tile dimensions a multiple of this value, which matters because the VAE works in multiples of 8. Leave it at 8 unless you have a specific reason.
Output:
layout(TileLayout) - the grid. Fan this out to Extract Image Tile, Merge Image Tile, and Generate Tile Mask. Every other tile node needs it.
How to install it
Install the pack in one go. ComfyUI Manager: search ComfyUI Nodes for External Tooling, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Acly/comfyui-tooling-nodes.git
then restart. No downloads - this is grid math.
Common issues & troubleshooting
Visible seams after merging. Almost always too little blending (or padding) for the content. Bump both up so there's a wider feather zone between tiles, and make sure Merge Image Tile is using the same layout object.
Too many or too few tiles. Remember the count is driven by min_tile_size and padding together. Want fewer, bigger tiles for speed? Raise min_tile_size. Want smaller tiles to fit less VRAM? Lower it.
Tiles diverge from the source. That's not this node - it only defines geometry. Divergence happens at sample time when each tile drifts from the original. The KB's standing fix for tiled upscaling is to condition each tile on the source with ControlNet Tile so it stays faithful; wire that into your per-tile sampling.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| min_tile_size | INT | 51264–8192 | — |
| padding | INT | 320–8192 | — |
| blending | INT | 80–256 | — |
| multiple | INT | 81–1024 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| layout | TileLayout | — |