Nodes/comfyui-zimage-sdnq/ZImage SDNQ Tile Upscale Sampler
ComfyUI Node

ZImage SDNQ Tile Upscale Sampler

The tile sampler that cheats the 2MP ceiling

By GeneralShan·Created 8 months ago·Updated 6 months ago· 1
ZImage SDNQ Tile Upscale Sampler
  • pipeline
  • image
  • images
prompt
negative_prompt
width1536
height1536
steps8
guidance_scale0.0
control_context_scale0.85
seed0
num_images1

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_scale 0 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.

CategoryZImage SDNQ/Samplers

Inputs (11)

NameTypeDefaultDescription
pipelineZIMAGE_CONTROL_PIPELINE
imageIMAGE
promptSTRING
negative_promptSTRING
widthINT153664–8192
heightINT153664–8192
stepsINT81–100
guidance_scaleFLOAT0.00–20
control_context_scaleFLOAT0.850–2
seedINT00–18446744073709550000
num_imagesINT11–8

Outputs (1)

NameTypeDescription
imagesIMAGE