Upscale and sharpen an old or low-resolution photo, without AI
Sharper, larger, nothing invented
Drop an old or small photo anywhere on this page. It is enlarged with Lanczos resampling and its real edges are sharpened, here in this tab. No AI rewrites a face or a line of text, and nothing is uploaded.
- JPEG
- PNG
- WebP
- AVIF
Upscaling without AI, done carefully
Upscaling an image without AI: what actually happens
A photo 800 pixels wide holds exactly 800 samples per row. To make it 1,600 pixels wide, something has to decide what goes in the 800 new places. There are two honest ways to do that and one dishonest one. The honest ways calculate new pixels from the real pixels around them, then raise the contrast of edges that are already there. The dishonest way, dressed up as “AI enhance”, generates detail that looks plausible. This tool does only the first, in four steps, entirely in your browser: optional noise reduction, Lanczos3 enlargement, a de-ringing pass, and a thresholded unsharp mask.
Resampling: nearest, bilinear, bicubic and Lanczos
Every enlargement method is a rule for weighting the source pixels near each new pixel.
- Nearest neighbour copies the closest source pixel. Nothing is blurred, but every pixel becomes a visible block and diagonal edges turn into stairs.
- Bilinear blends the 2×2 pixels around each new position. Blocks disappear, but so does edge contrast: the result looks out of focus.
- Bicubic fits a curve through a 4×4 neighbourhood. It is noticeably crisper than bilinear and is the default in most image editors.
- Lanczos3 weights a 6×6 neighbourhood with a windowed sinc function, three source pixels on each side along each axis. The sinc is the mathematically ideal reconstruction filter for a sampled signal; the window keeps it finite. It preserves the steepest edge transitions of the classical filters, which is why it is used here.
Beyond 4× none of them adds apparent sharpness, only size, so the tool stops there.
Ringing, halos, and the de-ring pass
Lanczos is sharp because its weighting has negative lobes: pixels a little further away are subtracted. On a hard edge that subtraction overshoots, leaving a thin bright line on the light side and a dark line on the dark side. Measured on a step from level 64 to level 192, the Lanczos3 enlargement used here left halos of 10–12% of the step at every scale from 1.5× to 4×. That is the “outlined text” look people associate with over-processed photos.
The fix is simple and exact. For every output pixel, the tool looks at the four source pixels that surround its position and clamps each colour channel into their minimum and maximum. In smooth areas the value is already inside that range and nothing changes. At an edge only the overshoot is removed, while Lanczos’ steeper transition, the part bilinear lacks, is kept. Video players call the same idea anti-ringing.
The unsharp mask: amount, radius and threshold
Enlargement spreads every edge over more pixels, so the result looks softer than the original at the same viewing size. An unsharp mask restores that contrast. It blurs a copy of the image, subtracts the blur from the original to isolate edges (the high-pass), and adds a multiple of that difference back. Three numbers control it:
- Amount is how much of the difference is added back, in percent: 100 adds it once.
- Radius is the width of the blur, in pixels. It decides which edges count. Here it is set per source pixel and multiplied by the scale, because a 4× enlargement spreads an edge four times wider than a 1× one; the floor is 0.5 pixels.
- Threshold is subtracted from every difference before it is amplified, in 8-bit levels. Grain and JPEG speckle are typically 2–4 levels, so a threshold of 3 leaves them almost untouched while a real edge, tens of levels high, is sharpened. It is applied softly rather than as an on/off switch, so a smooth gradient never shows a boundary where it crosses the threshold.
The presets are the engine’s exact values, with the change measured on a 2× enlargement of a test edge and a flat field of grain:
- Gentle: amount 60, radius 0.5 per source pixel, threshold 2, halo limit 2. Edge contrast +23%, grain +18%.
- Standard (default): amount 100, radius 0.6, threshold 3, halo limit 4. Edge contrast +42%, grain +22%.
- Strong: amount 150, radius 0.8, threshold 5, halo limit 6. Edge contrast +69%, grain +16%, because the higher threshold pays for the higher amount.
Two safeguards make these numbers safe. The halo limit caps how far a sharpened pixel may go beyond the brightest or darkest pixel of its 3×3 neighbourhood: 2 to 6 levels on a 128-level edge is under 5%, below what reads as an outline. And sharpening works on brightness only: all three colour channels are scaled by the same ratio, so hue and saturation cannot shift and no coloured fringes appear.
Why noise reduction comes before sharpening
A sharpener cannot tell grain from detail; it amplifies whatever high frequencies it is given. In an old JPEG many of those are block edges and mosquito noise around contrast, and sharpening them is the single biggest source of visible damage. So the optional noise reduction runs first, at the original resolution, before anything is enlarged.
It is a light bilateral filter: a 5×5 window, spatial sigma 1.2 pixels, range sigma 5 levels. A neighbour 3 levels away counts at 84% weight and is averaged in; one 15 levels away counts at 1% and is ignored, so edges survive. Measured, grain with a standard deviation of 4 levels keeps about 31% of its variance, while a fine texture of ±20 levels keeps about 87%. A stronger setting removed more grain but flattened texture to the plastic look of a beauty filter, which counts as distortion. It is on by default for JPEG sources and worth leaving on for scans.
Why this is not AI upscaling, and when AI is the better choice
Neural super-resolution models are trained on millions of images and predict what the missing detail probably looked like. On a small, clean photo of a common subject the result can be startlingly sharp. It is also a guess: a model will draw eyelashes, brick texture or legible-looking letters whether or not the photo contained them, and it can change a face, a digit or a signature without any sign that it did.
That makes the choice straightforward. For a family photo, an old document, evidence, or anything used as a record, use a method whose every output pixel is derived from real input pixels: the same file and settings always give the same result. When you want a picture that simply looks good, such as a tiny image enlarged for a poster or artwork where invented texture is welcome, an AI upscaler will usually look better, and this tool will not match it.
Output formats
- JPEG, quality 92: opens everywhere and keeps the sharpening intact. The default. Transparency becomes white.
- WebP, quality 90: usually smaller than JPEG at similar quality and supported by every current browser.
- AVIF: the smallest files, but the slowest to encode, noticeably so at 3× and 4×.
- PNG: lossless and the largest, often several times the JPEG. Choose it when the image will be edited again.
Limits and speed
The result can be at most 24 megapixels, because every stage holds several full-size copies of the image in the tab’s memory; scales that would exceed it are disabled before you run, with the reason. Sources over 40 megapixels are reduced during decoding. Measured on a laptop, a 640×480 photo enlarged 2× with standard sharpening and noise reduction took about 1.5 seconds; 4× with strong sharpening took about 5.3 seconds, most of it encoding the JPEG. At the 24 megapixel ceiling, a 3000×2000 photo enlarged 2× took about 38 seconds.
Questions
Can it recover detail that is not in the photo?
Why not use AI?
What is Lanczos resampling?
What does the threshold do?
Will it fix blur, scratches or compression blocks?
How large can the result be?
Other local image tools
All toolsStart processing
Drop a photo in, choose a scale and a sharpening strength, and compare the result with the original at 100%.