Free Image Upscaler
Enlarge a photo 4× with an AI model that runs on your own device — sharper edges and readable text, not just bigger pixels. Nothing is uploaded, no account, no watermark.
Drop files here, or click to browse
PNG, JPG, WebP, AVIF, GIF, BMP, HEIC, HEIF · processed on your device
or press Ctrl+V to paste from your clipboard
You can drop multiple files at once
How It Works
The upscaler runs Real-ESRGAN general-x4v3 — a 4.6 MB convolutional super-resolution network — through onnxruntime-web inside a Web Worker on your own machine. The model is fetched once from our own server, cached, and then used offline; your photo is decoded to a canvas locally and never uploaded. The scale factor is fixed at 4×, because it is hard-baked into the graph in two places.
- 1The image is cut into overlapping tilesA 4× result is sixteen times the pixels, so a 4000×3000 photo would be 192 megapixels — enough to kill the browser tab outright rather than merely slow it down. Instead the picture is partitioned into cores that tile it exactly, and each core is read with an extra margin of context on every side so the convolution stack (whose receptive field is 34 pixels) has real neighbouring pixels to work from. Borders are edge-replicated, never zero-padded, which would otherwise make the model sharpen a black rim around the frame.
- 2Each tile is packed as a planar RGB tensorA tile becomes a float32 tensor of shape [1, 3, H, W] with the red, green and blue channels stored as separate planes and values simply divided by 255 — no mean/standard-deviation normalisation of any kind. Every tile is padded to exactly the same square size, because the WebGPU backend recompiles its shaders for each new input shape and a plan with three different tile sizes would pay that cost three times.
- 3Inference runs on WebGPU where it exists, otherwise on the CPUThe session is created with WebGPU first and falls back to single-threaded WebAssembly on any failure — graphics drivers routinely advertise support and then fail partway through building the graph, and slower beats broken. Because the fallback changes the realistic size limit and the run time by a large factor, the tool re-checks the job against whichever provider it actually got before the first tile runs, and tells you which one it used afterwards.
- 4Tiles are cross-faded back together and clampedButt-joining tiles leaves a visible grid, so each tile's contribution is weighted by a linear ramp across the shared strip. The two ramps are exact complements, so the weights sum to precisely 1 at every output pixel and no bright or dark line appears along a seam. The model's raw output is not clipped inside the graph — measured values run from about −0.18 to +1.19 — so each sample is clamped to the 0–255 range before the 8-bit cast, which is what prevents speckle along high-contrast edges. Alpha is resampled separately and bilinearly, because the network itself has no alpha path.
- 5The result is encoded in the workerThe assembled pixels are drawn to an OffscreenCanvas and encoded to PNG immediately, so pressing Download has no asynchronous gap in front of it. Switching to JPG re-encodes from the canvas the worker is still holding rather than running the model again. A small centre crop is also rendered at 100% alongside the same region resampled by the browser, which is the only comparison at which a 4× difference is actually visible.
The model weights are downloaded once from our own server and cached; your image is decoded, tiled, upscaled and encoded entirely inside your browser, and no part of it is ever sent anywhere.
Guide
Worked example
Press "Try a sample". It adds sample-photo.png and the file chip shows 420×264. Before you press anything the page prices the job: "Output size" 1680×1056, "Tiles", "Estimated time" as a range, and "Runs on". On a desktop with WebGPU that is 4 tiles, about 0:01–0:02 and "Graphics card (WebGPU)". On a desktop without WebGPU it is 6 tiles, about 1:06–2:13 and "Processor (CPU)". A note adds that the finished image needs about 6.8 MB of memory. Press "Upscale 4×". The bar counts "Tile 1 of 4" up to "Tile 4 of 4", then reads "Finishing the image…". A "Detail (centre)" comparison appears with "Before" and "After · 4×". "Save as" starts on "PNG (lossless, larger file)" and the download is named sample-photo-4x.png. Set "Enlarge by" to 2× first and the button reads "Upscale 2×" and the file is sample-photo-2x.png.
Which settings to use, and the limits
- Check the size limit before you pick a photo. The limit depends on the device and on which processor the model actually gets. Under the drop zone the page says "images up to about 4 MP (around 2309×1732 px)" on a desktop with WebGPU. The other three figures are about 1 MP (1154×866) on a desktop processor, 0.5 MP (816×612) on a phone with WebGPU and 0.25 MP (577×433) on a phone processor. The result is also held to 16 times those pixel counts, and to 16,384 px on a side on a desktop or 8,192 px on a phone. A bigger photo is refused before the run, not after it.
- Choose "Enlarge by" and "AI strength". "Enlarge by" offers 2×, 3× and 4×, and starts on 4×. The model always works at 4×, so 2× and 3× are that result scaled down, which keeps its detail. "AI strength" runs from 0 to 100% in steps of 5 and starts at 100%. Lower it to mix in the browser's plain enlargement when text, logos or edges look too hard. Both settings are read when you press the button, so change them and press "Upscale again".
- Pick the saved format after the run. "Save as" offers "PNG (lossless, larger file)", "JPG (smaller file)" and "WebP (small file, keeps transparency)". Changing it re-saves the finished picture without running the model again, and "Preparing the file…" shows for a moment. JPG and WebP add a "Quality" slider from 50% to 100% in steps of 1%, starting at 92%. Transparent areas are kept in PNG and WebP. JPG fills them with white, and the page tells you so.
- Read the comparison for what it shows. "Detail (centre)" is a close-up of the middle of the image: your browser's plain enlargement on the left and the model's version on the right, at the same size on screen. "Whole image" shows the full picture, but both sides look alike there because they are shrunk to the same width. The pair is scaled to fit the column, so download the file to see it at full size. After "Upscale the centre crop" only the close-up is shown.
- Drop several images to run a batch. Drop or paste more than one image, or press "Add more files" beside a single one. The button reads "Upscale 3 images 4×" for three. They run one at a time with the same "Enlarge by", "AI strength" and "Save as" settings. An image over the device limit fails on its own row with "Too large to upscale on this device" while the others carry on. "Retry failed (N)" re-runs the failed rows, and "Download all (N)" gives a ZIP named like upscaled-4x.zip.
- On a phone, expect smaller sizes and a long wait. Phones use the lower limits above. Without WebGPU the page warns "This browser has no WebGPU, so the work runs on the processor — much slower, and the size limit is lower to match." The time shown before the run is a range, because it is extrapolated from one measured tile. Once tiles have run, a line such as "about 1:20 left" replaces the guess. If no progress arrives for 3 minutes, the run is stopped.
Common problems and how to fix them
- It says "This device fell back to the processor, and this image is too large to upscale that way. Try a smaller image, or a browser with WebGPU."
- The page guesses at WebGPU first, but the model can still land on the processor when it starts, and the processor limit is lower: about 1 MP on a desktop, 0.25 MP on a phone. Normally the page then upscales a smaller copy and says so. This error appears only when no smaller copy fits, for example after "Upscale the centre crop". The page then re-prices the photo for the processor and lists the options that fit. Pick one, shrink the photo, or try Chrome or Edge on a desktop.
- It says "Processing cancelled." and no picture appears.
- That notice follows pressing "Cancel", which takes the place of the "Upscale 4×" button while the model runs. A tile already being computed cannot be interrupted, so the worker stops at the next tile, and if it is still running after 2 seconds the page ends it. The model stays in the browser's storage, so pressing "Upscale 4×" again starts quickly. Cancelling during the model download stops the download too: "Download cancelled. Nothing was saved."
- It says "That image could not be read. Try a JPG, PNG, WebP or HEIC file."
- The browser could not decode the file. The page checks this when you add it, before any model download. Formats Chrome cannot draw, such as TIFF, SVG and PSD, and damaged JPEGs all fail this way. Open the picture in an image editor and export it as PNG or JPG, then add it again. A file of 0 bytes, common with OneDrive or iCloud files that were never downloaded, is refused first with its own message; download it to this device and choose it again.
- It says "This image is 4000×3000, which is too big to upscale on this device. Try one with a longest side of about 2309 pixels or less — upscaling is for small images, and a large photo already has the detail."
- 4× means sixteen times the pixels, so the page refuses a large photo before the run instead of failing minutes in. Under the message, "This image is over that limit. Pick a way forward:" lists only the options that fit: "Shrink to fit, then upscale 4×", "Use 3× instead", "Use 2× instead" and "Upscale the centre crop", each with a size such as "Result: 8000×6000 px". "Undo" returns to the original. You can also shrink the photo in an editor first.
- It says "Upscaling failed. Try a smaller image, or reload the page and try again."
- This is the catch-all. It covers a worker that reports no progress for 3 minutes, a browser that hands back a blank canvas for an output that is too large, and other errors the page cannot name. After any failure the page discards its worker, so the next try starts clean. Use a smaller image or reload, as the message says. A failed model download has its own message: "The model could not be loaded. Check your connection and try again."
How it compares
Real-ESRGAN redraws detail instead of stretching pixels, so on a small, soft picture it gives a different result from the plain enlargement in a photo viewer. This is one general model run at 4×, with 2× and 3× scaled down from it. It has no face mode, no denoise control and no sharpen control beyond the "AI strength" blend. The size limit keeps it to small images: about 4 MP at best, far less on a phone. A desktop AI upscaler or an online service can take larger files and bigger models, and may be faster on a strong graphics card. In exchange there is nothing to install, and your picture is not uploaded: only the 4.6 MB model and the engine that runs it are downloaded.
Related Tools
Audio to Text
Transcribe audio or video to text and subtitles, entirely on your device. Export SRT, VTT, ASS and more. No upload, no account.
Scan to PDF
Scan paper documents with your phone camera and save them as one PDF. The page edges are found automatically, each photo is straightened and cleaned up, and nothing is uploaded.
Invoice Generator
Create a professional invoice and download a clean PDF — line items, tax, discount, multi-currency. No sign-up, no upload, draft saved locally.