Nodes/ComfyUI 1hewNodes/Image Tile Split
ComfyUI Node

Image Tile Split

Slice big images into overlapping tiles so you can upscale or diffuse them on limited VRAM

By 1hew·Created about a year ago·Updated 7 days ago· 33
Image Tile Split
  • image
  • get_tile_size
  • tile
  • tile_meta
  • bbox_mask
modeauto
overlap_amount0.05
grid_row2
grid_col2
divisible_by8

Big images are the enemy of small VRAM. A 4K canvas won't fit through a diffusion pass or a heavy upscaler on a lot of cards, so the standard move is tiling: chop the image into overlapping pieces, process each one, then stitch them back. This node is the "chop" half of that pipeline, and it's smarter than the average crop-grid splitter because it thinks about the seams before you even start.

It pairs with the pack's Image Tile Merge, and the two are designed to be used as a set - the splitter hands the merge a metadata dictionary describing exactly where every tile came from, which is what lets the merge feather the overlaps instead of pasting hard lines. Use them together and the tile → process → stitch loop stops being the fiddliest part of your upscale workflow.

How it works

Feed it an image, pick a mode, and it computes a tile grid:

  • auto - estimates how many tiles the image wants (targeting ~1024×1024 per tile) and derives the grid from that.
  • grid - you set grid_row and grid_col explicitly (1–10 each). Predictable, good for known layouts.
  • preset modes - a fixed set of tile resolutions covering portrait and landscape buckets (672×1568 through 1568×672), handy when a downstream model likes a specific tile shape.

Then it sizes the tiles: base size = image ÷ grid, plus overlap_amount of overlap (interpreted as a fraction when ≤ 1, e.g. 0.05 = 5% of the image dimension, or as raw pixels when you type a bigger number), and rounds tile dimensions up to a multiple of divisible_by (default 8, so they stay sampler-friendly). Positions are computed to give full coverage - the tiles literally overlap so no edge is ever "owned" by a single tile that got processed in isolation.

There's also get_tile_size, an optional reference image input: if you connect one, its dimensions become the tile size and the grid is derived from that. Great for matching tile size to what a model actually wants.

Outputs - and the one you must not lose

  • tile - the IMAGE batch of tiles, row-major (top-left → bottom-right).
  • tile_meta - the DICT describing the full layout. This is the important one. It's not a normal image/mask type, and it must be wired into Image Tile Merge on the other side.
  • bbox_mask - a MASK batch marking each tile's coverage region on the original canvas, useful for visualizing or for building masks of "which tile owns which pixels."

Installing it

Part of the 1hewNodes pack. ComfyUI Manager → search "ComfyUI 1hewNodes" → install → restart. Or by hand:

cd ComfyUI/custom_nodes
git clone https://github.com/1hew/ComfyUI-1hewNodes

Restart ComfyUI. No model downloads; it runs on numpy, Pillow, and scipy.

Common issues

Most problems come from breaking the split/merge contract. Change the grid, overlap, or divisible_by after a split and the stored tile_meta no longer matches reality - re-split before merging. And if you run tiles through a per-tile pass that changes their dimensions, trim them back to the tile size before the merge, or the reconstruction will misalign. One more: auto mode only looks at the first frame of a batch - feed it a video and it tiles frame 0's layout for all of them, which is fine for consistent sizing but worth knowing.

Category1hewNodes/image/tile

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
modeCOMBOauto19 options: auto, grid, 672x1568 [1:2.33] (3:7), 688x1504 [1:2.19], 720x1456 [1:2.00] (1:2), 752x1392 [1:1.85], +13
overlap_amountFLOAT0.050–1024
grid_rowINT21–10
grid_colINT21–10
divisible_byINT81–1024
get_tile_sizeoptIMAGE

Outputs (3)

NameTypeDescription
tileIMAGE
tile_metaDICT
bbox_maskMASK