ZImage SDNQ Tile Upscale Sampler
The tile sampler that cheats the 2MP ceiling
- pipeline
- image
- images
Z-Image's native resolution tops out around 2MP - push past that and you get artifacts. So how do you get a 1536x1536 or bigger image out of a model that doesn't want to draw one? The community answer is the Tile ControlNet: feed the source image back into the model as a control condition at the target resolution, and let it regenerate the image larger while staying faithful to what was there. ZImageSDNQSamplerTileUpscale is that whole trick as one node: input an image, set a target width/height, get a bigger, more detailed image back.
This is the "more detail" flavor of upscaling, not the "more pixels" flavor. The node doesn't interpolate - it regenerates. A pure pixel upscaler (Lanczos, an ESRGAN) can't invent detail; this node invents detail for a living, which is exactly what you want when you've hit Z-Image's ceiling and need a final image that survives being looked at closely.
Inputs, ranked
- width / height - the target size, default 1536x1536 (range up to 8192). The source image is used as the tile control and the model generates at these dimensions. Bigger target = more creative reconstruction + more VRAM + more time; the 1536 default is a sensible sweet spot for a 1024 source. Don't treat 8192 as a goal - that's a whole render farm of a pass.
- control_context_scale (default 0.85, 0–2) - how faithfully the output tracks the source image. This is your "how much can it change" dial. High (near 1) and the output is a faithful, detailed enlargement - you're basically asking for a same-image redraw at higher resolution. Lower, and the model starts reinterpreting, which can add pleasing detail but also starts drifting from the source. The default 0.85 is well-chosen; go up for fidelity, down for creative reinterpretation.
- image - the source. It defines the starting resolution; the sampler compares its aspect ratio to the target and warns you if they diverge more than ~5%, because the guide image gets stretched to the target and a mismatched aspect ratio produces a visibly warped result. Square source to square target, 1024x1024 → 1536x1536, and you never see the warning.
- prompt / negative_prompt - the prompt still matters here, and unlike the T2I node this is a genuine second opinion: it steers what detail gets invented. At
guidance_scale0 the negative remains inert, but the positive prompt telling the model "crisp skin texture, sharp fabric" genuinely shapes the upscale. Keep it describing the enhanced result, not re-describing the original. - steps (8), guidance_scale (0), seed, num_images - the standard block. Seed matters more here than in T2I: because the model is inventing detail, different seeds give noticeably different texture and grain on the enlarged image. If one upscale comes back with ugly invented detail, re-rolling the seed is the cheapest fix.
Output: a single images tensor at the target dimensions.
The pipeline requirement
Like the other control-family samplers, this needs a ZIMAGE_CONTROL_PIPELINE from ZImageSDNQControlPipelineLoader - the tile mode lives in the Fun ControlNet Union (it arrived with the 2.1 8-step release, as a separate tile model, and the loader's control_config options cover the versions that have it). Wiring is minimal:
LoadImage → ZImageSDNQSamplerTileUpscale → SaveImage
ZImageSDNQControlPipelineLoader → (pipeline) ──┘
The pack ships exactly this graph as zimage_sdnq_tile_upscale.json.
The honest workflow advice
The 4-stage community upscale workflows for Z-Image - the ones that squeeze "every drop" out of the model - are iterative: generate small, upscale a stage, upscale again. This node is the single-pass version of that idea, and the difference in advice is simple: if you're going from a 1024 source to ~1500–1600, one pass here is great and fast. If you're chasing 4K from a 512 source, you're better off staging - each pass multiplies the model's native range instead of asking it to quadruple in one jump, and the community findings are consistent that control-heavy later stages degrade quality. Also worth knowing: because this is regeneration, faces get rewritten with every pass, same as any generative upscaler. If the subject's identity matters, budget a final low-strength I2I pass (ZImageSDNQSamplerI2I) to pull it back.
Install: Manager (search "Z-Image SDNQ") or git clone https://github.com/GeneralShan/comfyui-zimage-sdnq into custom_nodes, restart, and pip install sdnq diffusers timm opencv-python-headless for the control path. Drop the diffusers model in models/diffusers/, control weights in models/controlnet/, and you're upscaling.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | ZIMAGE_CONTROL_PIPELINE | — | |
| image | IMAGE | — | |
| prompt | STRING | — | |
| negative_prompt | STRING | — | |
| width | INT | 153664–8192 | — |
| height | INT | 153664–8192 | — |
| steps | INT | 81–100 | — |
| guidance_scale | FLOAT | 0.00–20 | — |
| control_context_scale | FLOAT | 0.850–2 | — |
| seed | INT | 00–18446744073709550000 | — |
| num_images | INT | 11–8 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |