ComfyUI Node

toobusy Hires Upscale

The hires-fix prep node that lands on a clean 2x every time

By nicekriss·Created about a year ago·Updated 3 days ago· 16
toobusy Hires Upscale
  • image
  • vae
  • upscale_model
  • image
  • latent
  • width
  • height
upscale_model_nameESRGAN/4x_foolhardy_Remacri.pth
downscale_methodlanczos
scale_by0.50

Hires fix has a choreography problem: upscale the image, resample it back down to a sane working size, and re-encode it to a latent so you can run a second pass. That's four nodes every time - upscale model loader, upscale-with-model, image scale, VAE encode - and the fiddly bit is the math in the middle. toobusy Hires Upscale folds all four into one node and, thanks to a smart scale_by default, makes the math land on a clean 2x without you doing division.

How it works

It runs the standard chain internally: UpscaleModelLoaderImageUpscaleWithModelImageScaleByVAEEncode. The scale_by field is the key to understanding it. A 4x upscale model (like the default 4x_foolhardy_Remacri.pth) makes your image four times bigger - which is usually way past what you want to re-sample. scale_by resamples after the model upscale, so a 4x model at scale_by = 0.50 lands on exactly 2x, and 1.0 keeps the raw model output. The tooltip says it plainly: "A 4x model at 0.50 lands on a clean 2x."

The downscale_method defaults to lanczos, which is the right call for resampling - it's the non-generative, can't-invent-detail workhorse. That's the correct division of labor here: the ESRGAN model adds pixels, lanczos resizes, and the VAE encode hands you a latent for the second diffusion pass.

The inputs that matter

  • image and vae - the obvious two; the VAE comes from your generation model's loader.
  • upscale_model_name - an ESRGAN-family model from your models/upscale_models/. The default Remacri is a solid general-purpose pick; 4x-UltraSharp is the other community standard. Connect an upscale_model (UPSCALE_MODEL) input to skip the dropdown entirely.
  • scale_by - the dial that matters. 0.5 with a 4x model = 2x final. If you want a 3x-ish target, think in terms of final size and work backwards.
  • downscale_method - lanczos unless you have a reason.

Outputs and where they go

  • latent - the VAE-encoded result, into your second-pass sampler (or the latent_override input of a fold node like Z-Image Turbo for a closed loop).
  • image - the resized pixels, handy if you want the intermediate.
  • width / height - the actual resized dimensions, so downstream nodes know what they're dealing with.

Install and gotchas

Standard pack install (Manager "toobusy", or git clone + restart). The upscale model is the only external file - it comes from an ESRGAN-family repo, not the pack. The README's recommended combo is exactly the loop this node exists for: Z-Image Turbo → Hires Upscale → Z-Image Turbo (latent_override).

The one thing people get wrong: this node resamples and re-encodes, it doesn't add detail. If your first-pass image is soft and you were hoping the hires pass would invent texture, the ESRGAN model adds some, but the real fix for "soft" is generating at a higher native size, not upscaling. Use this node for the classic two-pass flow where the second pass does the quality work - it's prep, and it's good at it.

Categorytoobusy/Make

Inputs (6)

NameTypeDefaultDescription
imageIMAGE
vaeVAE
upscale_model_nameCOMBOESRGAN/4x_foolhardy_Remacri.pthESRGAN-family upscale model. Skipped when the upscale_model override is connected.
downscale_methodCOMBOlanczos5 options: nearest-exact, bilinear, area, bicubic, lanczos
scale_byFLOAT0.500.05–8Resample factor applied AFTER the model upscale. A 4x model at 0.50 lands on a clean 2x. 1.0 keeps the raw model output.
upscale_modeloptUPSCALE_MODEL

Outputs (4)

NameTypeDescription
imageIMAGE
latentLATENT
widthINT
heightINT