Iterative Upscale (Image)
The same stepwise upscaler, but it takes and returns pixels
- pixels
- upscaler
- vae
- image
This is the image-in, image-out version of Impact Pack's stepwise upscaler. Same idea as the latent one - split a big upscale into several small steps so detail keeps pace with resolution instead of the model having to invent everything in a single jump - but it takes a pixel image and gives you a pixel image back. If your working data is already decoded (you're upscaling a loaded photo, or a result from a node that outputs IMAGE), this saves you from manually encoding to latent, running the latent version, and decoding again. It just does that round-trip inside itself.
Under the hood it is the latent version. The docs say so plainly: this node runs Iterative Upscale (Latent) internally and handles the VAE encode/decode for you.
How it works
You give it an image, a scale factor, a step count, an upscaler provider, and a VAE. It encodes the image to latent, calls the latent iterative upscaler (which enlarges-and-resamples in stages, dividing the scale across the steps), then decodes back to pixels. The stepwise part is what buys the coherence: at each stage the upscale is small enough that the sampling pass can fill in plausible detail rather than smearing.
The inputs and outputs that matter
pixels(IMAGE) - the image to upscale.upscale_factor(default 1.5) - total enlargement. 1.5–2x per node is the comfortable range.steps(default 3) - number of stages the scale is divided across. More steps, gentler growth, better coherence, more time.upscaler(UPSCALER) - the provider node (typicallyPixelKSampleUpscalerProvider) that does the actual upscale-and-sample each step. Required; the node is inert without it.vae(VAE) - needed here because this node does its own encode/decode. The latent version doesn't ask for a VAE input on the way in; this one does.step_mode(simple/geometric) - how the scale factor is spread across steps.
The single output is the upscaled image.
How to install it
ComfyUI Manager: search ComfyUI Impact Pack, Install, restart.
Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Impact-Pack
cd ComfyUI-Impact-Pack
pip install -r requirements.txt
Run the pip in ComfyUI's Python environment and restart. Drop a 4x upscale model into ComfyUI/models/upscale_models to feed the provider - that's what makes each step cheap.
Common issues & troubleshooting
Missing upscaler again. Same gotcha as the latent version: the upscaler input wants a provider node (PixelKSampleUpscalerProvider), not an upscale-model file. If you're hunting for a model dropdown, there isn't one - wire the provider.
Which one should I use, image or latent? If your data is already a latent (fresh out of a KSampler and you're going to keep sampling), use the latent node and skip the extra decode/encode. If you're holding pixels, this node is the convenient choice. They produce the same thing; it's purely about avoiding needless VAE round-trips.
Out of memory on big targets. The pixel provider decodes the full frame each step. Switch the provider to the tiled variant (PixelTiledKSampleUpscalerProvider, which needs ComfyUI_TiledKSampler installed) to keep VRAM in check.
Judge whether you even want a generative upscale. This adds detail via sampling. On an already-sharp source that only needs more pixels, a plain ESRGAN model is faster and won't alter content - reach for that instead.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| pixels | IMAGE | — | |
| upscale_factor | FLOAT | 1.51–10000 | — |
| steps | INT | 31–10000 | — |
| temp_prefix | STRING | — | |
| upscaler | UPSCALER | — | |
| vae | VAE | — | |
| step_mode | COMBO | simple | 2 options: simple, geometric |
| vae_compression | INT | 80–256 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |