A free tier on an upscaler is counted, not unlimited. ImgLarger's Free plan is 100 credits a month and 2X maximum, with a Create Account button on it. Bigjpg's free plan is 20 enlargements a month, 5MB upload, no batch. Remini's help centre says you create an account and start a weekly, monthly or yearly subscription, and that "some limitations may apply in terms of quantity and quality" (all three checked 2026-11-12).
So the budget is counted. For a one-person shop the question is which photos deserve a credit at all, so I put three samples through eight ways of enlarging and turned the numbers into a triage order.
The setup is a round trip, since an upscaled image has no answer key. Three sharp 1024 by 1024 samples: a portrait, a landscape, and a text page I drew myself, carrying Chinese body type from 40 px down to 11 px and a 24-cell grid of 1-pixel rules. Each goes down to 512 or 256 with Lanczos, then every method puts it back to 1024 and gets scored against the original. Methods: nearest, bicubic and Lanczos from Pillow 11.3.0; ESPCN, FSRCNN, EDSR and LapSRN through OpenCV 5.0.0 dnn_superres on the official pretrained weights; SSIM from scikit-image 0.24.0 plus my own PSNR and block counts. The GAN column came from the fast tier of ImgIng's browser upscaler https://imging.ai/ , which its panel named Real-ESRGAN General x4v3, tier one of five — the other four never ran. One Apple-silicon Mac, desktop Chromium, one run each.
Portrait and landscape samples are CC0 images from Wikimedia Commons by William Stitt and Bonnie Moreland; the text sample is my own.
Flat photos gain almost nothing
Scored per region rather than per image, the sky patch came back at 46.57 to 51.06 dB for all eight methods at 4x, the low end being the GAN tier and the high end plain bicubic. A floor of 46 dB is an error level you can ignore outright. The eyelash patch of the same portrait runs 29.56 to 33.04 dB, a comparable few decibels of spread that means something entirely different that far down. Sharpness happens where there are edges, so on these samples a frame that is mostly empty plate leaves a model almost nothing to recover.
Hairlines do not come back
The 1-pixel rule grid on my text page survived nothing. After the downscale those lines are already ambiguous, and every method, interpolators included, put them back as bars of uneven weight. I never scored that region, so this one is eyes on the output files, not a number. Anything with hairlines or dense small type belongs in a re-export at the size actually needed.
The sharpest text is the least trustworthy
On the text page at 4x the GAN tier scored 17.81 dB on the small body-type region, the lowest of the eight, against 21.05 for Lanczos. On whole-image SSIM the same pair reads 0.9048 against 0.8177, so the version furthest from the original per pixel is the closest in structure, and the one that looks best on screen. Shrink each result back down and compare it to the small input and the same pair separates again: on this text page the three interpolators land between 34.68 and 36.38 dB while that tier reads 26.45. Those are text-column numbers only, since on the portrait and the landscape every method sits roughly ten decibels higher. Strokes are redrawn, convincingly. That tier's own boundary note (checked 2026-11-12) says the result suits visual enhancement and should not be used for forensics or for checking text against an original. So a batch code or price label gets read off the original.
Spend at 2x before 4x
Cut both images into 8 by 8 blocks and compare standard deviation per block: σ_out > 1.5·σ_gt + 2 counts as an added block, σ_out < σ_gt/1.5 − 2 as a lost one. Those thresholds are mine for this round, not a standard.
Both counts run higher at 4x than at 2x here, by amounts too uneven to average into one multiple. The GAN tier's portrait went from 0.22% added at 2x to 1.53% at 4x, while the same tier's text page barely moved, 4.24% to 4.93%. Lost blocks are the steadier argument: that tier lost 7.32% on the portrait at 2x and 21.09% at 4x, 0.33% then 2.62% on text, 1.51% then 8.14% on the landscape. More of the original is missing at 4x, so more of what comes back is the model filling in rather than anything recovered from the input. One limit on reading this: interpolation barely adds detail in the portrait and landscape columns, not everywhere. On the text page Lanczos added 7.37% of blocks at 2x and 16.16% at 4x. Jagged thin strokes raising the block variance is my guess, unverified.
What these numbers do not cover
The blur here is manufactured, a sharp file pushed down with Lanczos and pulled back. Real bad photos carry missed focus, shake, grain and JPEG damage, and this round says nothing about those. Three samples, one machine, one run each, nothing above 1024 pixels, no scans, and every GAN number from one of five tiers. The order of the four checks still holds, and the reason it saves anything is that the first two run before a single credit is spent: a flat pack shot and a hairline grid can both be settled without an upscaler in the loop at all.