Element Tile Split
Chop one image into tiles that know what they are
- image
- split_images
- original_image
- prompt
- negative_prompt
- grid
Element Tiled Upscale is the one-node version of this pack and, for most people, the right answer. Element Tile Split is the version where you keep the sampler. It does the geometry and the encoding, hands you a list of latents and a list of conditionings, and lets a stock KSampler do the denoising - so sampler settings, LoRAs, guider tricks and ControlNet stacks stay in your hands instead of disappearing into one black box.
It's also the node for when you want to not upscale. upscale_by at 1.0 makes it a tiling harness: same edit model, same reference anchoring, but at native resolution where the model is comfortable and a small subject can own its own tile. Underrated - instruction-driven edit models mostly took over the character-consistency job, and they do it far better on a crop than on a 4K canvas.
How it works
You give it an image, vae, clip and model. It works out an output size, snaps it to a token-aligned grid, and plans tiles. Two ways to define that grid: with tile_mode on, columns and rows decide, and the planner grows tiles just enough that N of them cover each axis evenly. With tile_mode off, tile_size decides and you get however many tiles that takes. tile_size at 0 auto-picks about a quarter of your longest side, clamped to 1024–1536, because attention cost grows with the square of the tile's token count.
Then, per tile: crop the source, encode the prompt against that crop, and build the reference latent on models that can consume one. That per-tile reference is the point of the node. On Qwen Edit 2509/2511 the crop also enters the text encoder's vision slot at grounding_px (0 or ≥384 means the official 384×384 bucket); on Qwen Image 2.1 it lands precisely in the vision token positions. Non-edit models ignore all of it.
The grid output is the geometry receipt - tile rects, fade widths, canvas size, overlap. Element Tile Merge needs it later, because the merge isn't guessing where each tile goes, it's being told.
What you set
upscale_by is the honest one: 1.0 for a pure tiling pass, 1.5–2.0 when you want more pixels. Tiles get regenerated at tile resolution either way, so even 1.0 re-synthesises detail.
reference_mode changes what kind of workflow this is. Leave it off for the plain conditioning path. Turn it on for Krea 2's identity-edit in-context forward, which then needs Element Krea 2 In-Context Patch downstream of your model loader.
grounding_px only matters if your model has a vision path. More of the source reaches the text encoder, at the cost of memory per tile. On Edit 2509/2511 it's the first dial to lower when VRAM gets tight.
prompt is encoded per tile but identical for all of them, so keep it true of any crop. The default - "enhance quality preserving all the details" - is a fine template. negative_prompt left blank encodes an empty string, which is exactly what Krea 2's identity-edit expects at cfg 1.
Outputs and wiring
Five outputs: tile_positives and tile_negatives (CONDITIONING lists), tile_latents (LATENT list), grid (ELEMENT_TILE_GRID, single), tile_sources (IMAGE list - the source crops).
The trick is that ComfyUI broadcasts lists: wire them into a normal KSampler and it executes once per tile, accumulating decoded results in tile order. So the chain is Split → KSampler (latents, positives, negatives, your model) → VAE Decode → Element Tile Merge, with the same grid connected to Merge.
For the conditioning path you also need the per-step reference schedule, and Split doesn't output a MODEL. That's why Element Strength Schedule exists: run your model through it into the KSampler's model input. On Krea 2, the Patch node is mandatory in this path - without it the reference latents get dropped before they reach the model.
Install
Manager → search ComfyUI-Element_TileEdit (renamed from TileUpscale). Or:
cd ComfyUI/custom_nodes
git clone https://github.com/supElement/ComfyUI-Element_TileUpscale
Restart after. No requirements.txt, no pip installs, no model downloads - the only extra file in the ecosystem is the krea2_identity_edit LoRA, and only on the Krea 2 route.
Where it bites
clip isn't decorative. The node inspects your tokenizer's signature to decide whether the model can consume images at all, and falls back to reference-latent-only when it can't. A mismatched clip gives you a weaker reference with no warning.
And the pack reaches into model internals rather than a public API - class-name matching, attribute probing. Upstream changes have broken that kind of detection across the ecosystem before, and here the failure is silence rather than a stack trace. Identity preservation quietly stopping after an update is the symptom.
Last one, boring but universal: your tile count is your sampler count. Eight tiles at 20 steps is eight full sampling runs. Budget for it, or use a fixed tile_mode count so you know the bill up front.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| layout_data | STRING | {} | Internal UI state (hidden). |
| imageopt | IMAGE | — |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| split_images | IMAGE | — |
| original_image | IMAGE | — |
| prompt | STRING | — |
| negative_prompt | STRING | — |
| grid | ELEMENT_TILE_GRID | — |