Image Upscale By
Quick, clean upscaling that isn't a model
- image
- image
There are two kinds of upscaling in ComfyUI, and knowing which one you need saves you a lot of VRAM and a lot of waiting. "Image Upscale By" is the honest, boring kind: pure interpolation. It makes your image bigger using high-quality bicubic sampling with anti-aliasing. It can't invent pores or fabric weave, it runs in milliseconds, and it's exactly the right tool more often than people admit.
What it is
NNImageUpscaleBy scales an image by a scale_by factor using bicubic interpolation - the "more pixels" category from the upscaling playbook, as opposed to a generative model like ESRGAN or SeedVR2 that adds detail. The pack's README is explicit about the recipe: "high-quality bicubic interpolation with anti-aliasing," with large-batch support, GPU/CPU selection, and memory-efficient chunked processing.
How it works
The mechanism is refreshingly direct. It reads the input shape, multiplies width and height by scale_by, and runs torch.nn.functional.interpolate in bicubic mode with align_corners=False and antialias=True. That antialias flag matters: plain bicubic can shimmer and alias when upscaling, and the antialias filter is what keeps edges from looking crunchy. Think of it as a Lanczos-quality resample without the extra dependency - the same "milliseconds, no hallucination" family the KB's upscaling doc puts alongside Lanczos.
The batch machinery is the second half of the story. Like the pack's other processing nodes, it chunks through the batch (batch_size, 1–256 frames per chunk), moves each chunk to the chosen device (gpu or cpu), and copies results back off-GPU as it goes. A 200-frame video sequence upscaled 2× won't balloon your VRAM the way a naive one-shot resize would.
Two fast paths to know: scale_by of 1.0 passes the image through unchanged (no-op), and it's a pure resampler - no model weights, no config files, nothing to download.
The inputs
image- the tensor to scale.scale_by- 0.01 to 16, default 1.0. 2.0 doubles the dimensions; 0.5 halves them (yes, it downscales too, same filter).batch_size- frames per chunk, 1–256.device-gpuorcpu.
Single image output with the scaled dimensions.
When to use it
Reach for it when your image already has the detail and just needs more pixels: feeding a hires-fix second pass, resizing for a video model's input requirements, or making a small image display-ready before you run a detailer. This is the right move before any generative step, because upscaling-then-detailing gives the detailer clean large pixels to work on. The KB's upscaling doc is blunt that plain interpolation is "still the correct answer and gaining share" - when the source is already sharp, a generative upscaler wastes time and can even add unwanted texture.
Where it's wrong: genuinely low-res, soft sources. Interpolation can't fabricate detail, so if you want to "resurrect" a small image, this is the wrong node - that's ESRGAN/SeedVR2 territory (and the video world's FlashVSR), with this node as the optional clean-up pass after.
Installing
Ships in bandifiu/ComfyUI-NN-custom-nodes:
cd ComfyUI/custom_nodes
git clone https://github.com/bandifiu/ComfyUI-NN-custom-nodes
Restart ComfyUI (or Manager → "NN-custom-nodes"). Deps are just torch, numpy, pillow - no model downloads. GPL-3.0, V3 backend API, no classic registration dicts in the source.
The practical gotcha is overshoot: at scale factors above ~4×, bicubic interpolation runs out of information and you start seeing soft mush, not sharpness. For big jumps, scale in steps or switch to a model upscaler - this node's sweet spot is 1.5×–4× on already-clean images.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| scale_by | FLOAT | 1.000.01–16 | — |
| batch_size | INT | 11–256 | — |
| device | COMBO | gpu | 2 options: gpu, cpu |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |