Pixel Anchored Remaster
The cleanup-and-rebuild pass for your 2x hires-fix output
- image
- model
- vae
- positive
- negative
- image
- latent
The name says "remaster," and that's the part everyone skips. This is not another upscaler you throw at an image when you want more pixels. It's a cleanup-and-rebuild pass for an image that has already been upscaled - and it assumes you know that. Feed it a raw base-resolution render and you'll be confused by the results, because it isn't designed to add resolution at all.
The pitch, in the author's own words: it takes an image that's been through HiRes Fix (or another high-res stage), strips out the upscale artifacts, and rebuilds the detail with a fresh KSampler pass. Minor drift from the source is fine - the goal is a better image, not a pixel-perfect clone. If you need perfect fidelity, reach for a plain ESRGAN upscale instead and don't look back.
What it actually does
This is a one-node version of a workflow you'd otherwise build from five or six stock ComfyUI nodes, and the order of operations is the clever part:
- Pixel-space downscale. The input is shrunk to 75% of its size (rounded to a multiple of 8) using
ResizeAndPadImage, with white padding and your chosen interpolation (defaultlanczos). Aggressive upscaling leaves harsh, noisy texture behind; shrinking first gives the next stage something cleaner to work with. - VAE-encode, then latent upscale. The downscaled image is encoded to latent space with tiled VAE support, then upscaled back to the original input size in latent space (default
bislerp). That gives the sampler room to work without losing the working resolution. - KSampler rebuild. A standard sampling pass -
dpmpp_3m_sde_gpu/karras, 16 steps, CFG 4, denoise 0.55 - reinterprets the latent and puts structure back where the first pass left things soft or fake-looking. Then it's decoded, tiled again to keep VRAM in check.
In plain English: pixel downscaling cleans the image up, latent upscaling gives the model room, and the sampler ties both together into one remaster pass. It's essentially the hi-res-fix img2img idea (generate at native, second pass at low denoise) applied after an upscale instead of during one.
The inputs that matter
The full wiring list is long, but only a few are things you'll actually touch:
image- your already-2x-hires-fixed image. This is the one input that's easy to get wrong.model,vae,positive,negative- the checkpoint and conditioning for the remaster pass. Same model that made the image works fine.seed- for reproducible remasters.remaster_denoise(default0.55) - the big one. Too high and the composition drifts into a different picture; too low and it's just an expensive blur. The default is the author's tested sweet spot.tile_size_vae(512) andoverlap(64) - tiled VAE encode/decode settings. Drop the tile size if you're hitting VRAM limits.interpolation(lanczos),upscale_method(bislerp),sampler_name/scheduler,remaster_steps/remaster_cfg- the plumbing. Defaults are the author's tested ones; leave them alone until you have a reason not to.
It outputs two things: image (the remastered result, wire it to a preview or Save Image) and latent (the sampled latent before decode, handy if you want to chain another latent-space step onto it).
Install
Tiny pack, no model downloads, no requirements.txt to fight with - the whole node is built from ComfyUI's own built-ins, so there's nothing extra to pull down. The easy route:
- ComfyUI Manager → Install Custom Nodes → search "PixelAnchoredRemaster", install, restart.
- Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/NotProniss/PixelAnchoredRemaster
…then restart ComfyUI. That's it.
Where people get burned
- Wrong input. It's built for 2x upscale workflows only. The author is blunt that 4x "starts going off the rails." Feed it a 4x upscale and expect ugly.
- Wrong model family. It's tuned for SDXL / Pony / Illustrious-style latent spaces. The README warns it performs poorly with Anima and likely other divergent latent spaces like Chroma, where the remaster step gets ugly. Stick to the SDXL family and it behaves.
- Square-only on Anima. Even where Anima sort of works, the author found it reliable only with square images - portrait inputs come out blurry, for reasons not yet pinned down.
- Expecting fidelity. This is a generative re-pass. It will reinterpret small details. If "different but better" isn't what you want, this is the wrong tool - and that's by design, not a bug.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | MODEL | — | |
| vae | VAE | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| seed | INT | 10–18446744073709550000 | — |
| tile_size_vae | INT | 51264–4096 | — |
| overlap | INT | 640–512 | — |
| interpolation | COMBO | lanczos | 5 options: area, bicubic, nearest-exact, bilinear, lanczos |
| upscale_method | COMBO | bislerp | 5 options: nearest-exact, bilinear, area, bicubic, bislerp |
| remaster_steps | INT | 161–1000 | — |
| remaster_cfg | FLOAT | 4.00–100 | — |
| sampler_name | COMBO | dpmpp_3m_sde_gpu | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | karras | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| remaster_denoise | FLOAT | 0.550–1 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| latent | LATENT | — |