Compress images without uploading them

Your photo is too large to upload? Too big for email? This is the fastest way to make it smaller. Everything runs inside your browser — add one photo or five hundred, the engine measures each image, picks the smallest file that still looks identical, and hands it straight back to you.

  • Nothing is uploaded
  • JPEG · PNG · WebP · AVIF
  • HEIC from iPhone
  • Unlimited & free

Drop your images here

or paste from the clipboard ·

JPG · JPEG · PNG · WebP · AVIF · HEIC · GIF · BMP — no file count limit

Compression settings

Applied to every image
Strategy

Auto measures each image: it encodes a test pass at several quality levels, scores the result against the original, and keeps the smallest file that still clears a ~40 dB fidelity floor.

Output format
Advanced options

Need exact dimensions or a centre crop instead of a cap? The batch image resizer does that.

Sharpening after resize

Auto applies a halo-free unsharp mask only when an image is scaled below 82%.

When a batch finishes

Generated in your browser by a synth — no audio file is downloaded, and it stays silent when a batch finishes in a couple of seconds.

Processing engine

WASM codecs are fetched from a public CDN on first use and give slightly smaller files. Every fallback still works offline.

What this compressor actually does

Most online compressors work the same way: your file is uploaded, passed through a fixed preset such as "quality 80", and sent back. That preset has no idea what your image contains, so a smooth sky and a photo of tree branches receive identical treatment — one ends up unnecessarily large, the other unnecessarily degraded.

This tool inverts the process. Your image is analysed first, then encoded to fit the evidence. It is the same strategy used by professional build pipelines, running in a browser tab you can close at any time — and entirely on your own hardware, so nothing is uploaded. In plain terms: you drag in a file that is too large for the form, the email or the storage quota, and you get back a file that is smaller — same picture, fewer bytes, no round trip. If you want to check that rather than believe it, the compress without uploading page walks through a ten-second test you can run on any tool, including this one.

The five things that make the output smaller

  1. Measured quality instead of a fixed preset. A small proxy is encoded at several quality levels and decoded again; each result is scored against the original using PSNR. The engine keeps the lowest quality that still clears a 40 dB fidelity floor, with headroom so the full-resolution encode stays there too.
  2. Quality-aware format selection. Opaque photographs stay in a photographic codec; graphics with flat colour and few unique tones stay in PNG, where lossless and palette encoding win outright. Across our own measurements AVIF lands about a quarter below MozJPEG at equal measured fidelity, while WebP comes out roughly level with it.
  3. Palette quantization for PNG. Screenshots, diagrams and flat illustrations rarely need 16.7 million colours. A median-cut quantizer reduces them to 256 (or fewer) with optional Floyd–Steinberg dithering, then writes a true indexed PNG — typically 70–90% smaller with no visible banding.
  4. Iterative halving when downscaling. Shrinking a 6000 px photo to 1600 px in one step aliases badly. Halving repeatedly and smoothing at each stage preserves edge structure, which in turn lets the encoder spend fewer bits on the same perceived quality.
  5. Metadata removal. EXIF blocks, thumbnails embedded inside the file, GPS traces and maker notes can add tens of kilobytes on their own. They are dropped, while the orientation tag is applied to the pixels first so nothing ends up sideways.

When the file is already as small as it gets

Compression has a floor, and most people meet it as a complaint: they run the tool twice, the second time does nothing, and the tool is called broken. It is not. A first pass removes the bytes a codec can describe more cheaply; the second pass is then handed a file whose bytes are already close to as random as they need to be, so there is almost nothing left to find. Measured on this engine, three photographs at 2400 × 1600 were encoded three times each at the same setting: they went from 1,368,828 bytes to 1,368,713 bytes — 115 bytes across all three.

What should happen next is that the tool says so. This one labels the result already optimal and, when a re-encode would come back bigger than the original, hands you the original file you uploaded — the same bytes you dropped in, not a copy that lost quality and gained nothing. The why your image won't get smaller page walks through that measurement, the three things that usually hold a file up, and the three levers that do move the number.

The complaints that bring people here are all the same complaint, phrased a different way each time: the image is not getting smaller, or it doesn't get smaller on the second try, or the file came back bigger than the original — bigger than before, in other words — or the copy it hands back barely got smaller, or the last pass only came out barely smaller than that, or nothing moves at all when you run it again and compress it again a third time. When a tool has to send the file to a server first, the original bytes come back as somebody else's copy from a random server, and the file you end up holding is not quite the one you chose. None of that is what happens here. Your photo never travels anywhere, and the tool will keep the original whenever a pass cannot improve on it. The why your image won't get smaller page walks through that measurement, the three things that usually hold a file up, and the three levers that do move the number. It also collects the complaints people make about batch work: a media library of several thousand images is not something you do by hand, one at a time, there is no daily limit, and there is no cap on how many files you bring and no account.

Choosing a strategy

StrategyBest forWhat it optimizes
AutoEveryday use, large batchesSmallest file that is still visually identical
QualityPredictable, repeatable outputA fixed encoder setting you control
Target sizeUpload limits, forms, email capsLanding under an exact KB budget

Which output format should you pick?

FormatCompressionTransparencyUse it for
WebPExcellentYesThe default recommendation for the web
AVIFBestYesMaximum savings when you can wait a moment longer
JPEGGoodNoMaximum compatibility with older software
PNGLosslessYesScreenshots, logos, anything that must stay pixel-exact

A note on transparency: JPEG cannot store an alpha channel. If your PNG has transparency and you export to JPEG, the transparent areas are flattened onto white. Choose WebP or PNG to keep the alpha channel intact.

Measured results

Most compressors quote a savings figure and leave it at that. These are the numbers this engine actually produced on our own test set, dated and with the method written out below, so the claim can be checked instead of taken on trust. Every value is a real encode by the page you are reading — the sizes were produced by the encoders, not estimated.

Auto mode: what actually comes out

Average output size in Auto mode, by what you feed in. Three 2400×1600 photographs per photo profile, plus one 1440×900 UI screenshot.
SourceOutputBefore AfterSmallerMeasured fidelity
Camera / phone JPEGJPEG1054 KB652 KB38% (38–39%)50 dB
Camera / phone JPEGWebP1054 KB674 KB41% (24–54%)43 dB
Camera / phone JPEGAVIF1054 KB507 KB57% (41–68%)47 dB
Camera / phone JPEGPNG1054 KB1054 KB0% — original kept—
Photograph saved as PNGJPEG3064 KB398 KB87%45 dB
Photograph saved as PNGWebP3064 KB302 KB90%42 dB
Photograph saved as PNGAVIF3064 KB210 KB93%44 dB
Photograph saved as PNGPNG, 256 colours3064 KB1819 KB41%37 dB
Already-optimised JPEGJPEG493 KB493 KB0% — original kept—
Already-optimised JPEGWebP493 KB487 KB2% (0–5%)42 dB†
Already-optimised JPEGAVIF493 KB433 KB17% (0–37%)45 dB†
Already-optimised JPEGPNG493 KB493 KB0% — original kept—
PNG screenshotJPEG100 KB73 KB27%45 dB
PNG screenshotWebP100 KB26 KB74%45 dB
PNG screenshotAVIF100 KB4 KB96%47 dB
PNG screenshotPNG, 80 colours100 KB30 KB70%58 dB

† Averaged over the images that changed; the others came back untouched, which is what the 0% means. A photo that is already well optimised cannot be improved at this fidelity, so the engine returns your original file rather than a larger one. The range in brackets is the spread across the individual test images. PNG output is a separate strategy — palette quantization trades colour depth rather than applying the lossy fidelity floor — so its dB figures sit outside that floor by design.

At equal fidelity, is WebP really smaller than JPEG?

The usual figure is that WebP beats JPEG by 25–50%. We measured it rather than repeating it, by holding fidelity constant at 40 dB — the level this tool's own floor targets — and comparing the bytes each codec needed to get there. The result is more interesting than the slogan, and less flattering to WebP.

Bytes required to reach 40 dB PSNR on the same pixels. Lower is better.
2400×1600 photographJPEG (MozJPEG)WebPAVIF
Photo 1348 KB375 KB239 KB
Photo 2270 KB268 KB164 KB
Photo 3751 KB1054 KB616 KB
Average457 KB565 KB340 KB
Against JPEG—24% larger26% smaller

Two things explain the gap between this and the familiar claim. The first is the encoder: the 25–50% figure comes from comparing WebP against a baseline JPEG encoder, and MozJPEG — which is what this tool uses — is considerably stronger at high quality settings. The second is the metric: WebP's advantage is largest in perceptual measures such as SSIM and at lower quality settings, while this comparison is in PSNR, which is the definition our own fidelity floor uses. Neither of those makes WebP a bad format, and it remains the safest choice for compatibility. It does mean that AVIF is the one to pick when the smallest possible file is the goal, and that the honest headline for photographs is AVIF, not WebP.

How these numbers were produced

  • Corpus. Three 2400×1600 photographs, each in three states: as an already-optimised JPEG, re-encoded at Q96 to stand in for a straight-from-camera file, and stored losslessly as a 3 MB PNG. Plus one 1440×900 interface screenshot generated in the browser so it is identical on every run. All files are pinned by SHA-256 and the measurement script prints every hash it used, so a changed encoder shows up as a changed hash rather than as a quiet shift in the table.
  • Fidelity. PSNR on luma, measured the same way the engine's own quality search measures it, against the original pixels at full resolution.
  • Encoders. MozJPEG (WebAssembly) for JPEG, the @jsquash builds for WebP and AVIF, and the browser's own canvas encoder plus this site's median-cut quantiser for PNG. A case that silently fell back to a browser-native encoder is never published as a WebAssembly result.
  • Timing. Every case is encoded twice. The first pass pays for the codec download and WebAssembly instantiation, and only the second pass is reported — a cold-start number would misdescribe normal use.
  • Environment. Chromium headless, Windows Server, Node 22. Output size depends only on the encoders and should hold anywhere; the timings depend on the machine and should be read as indicative.
  • Reproduce. node _dev/measure-compression-matrix.cjs produces the first table, node _dev/measure-format-efficiency.cjs the second. Both drive the real engine in this page.

Known variance: AVIF is by far the slowest encoder here and its quality search can hit its patience budget on a loaded machine, so AVIF figures — especially the savings on already-optimised photos, which ranged from 0% to 37% across runs — are the least stable in the table. Measured 2026-09-20.

Frequently asked questions

How do I compress an image to exactly 200 KB?

Set Strategy to Target size and type 200 in the KB field. The engine binary-searches the encoder quality across up to seven passes, and if even the lowest sensible quality overshoots, it downscales the image step by step until the file fits. The result panel shows exactly what it did.

Does compressing reduce image quality?

Lossy formats always discard something, but Auto mode holds measured fidelity above ~40 dB PSNR, which is past the point where differences are visible at normal viewing sizes. If you want certainty rather than heuristics, use Quality mode with a high setting or export PNG, which is lossless.

Why does compressing twice not make it any smaller?

The first pass already removed the bytes a codec can describe more cheaply, so the second pass finds almost nothing left to take. Run on this engine, three photographs encoded three times at the same setting went from 1,368,828 bytes to 1,368,713 bytes. Switching codec can still find something to remove — the table below shows AVIF ranging from 0% to 37% on already-optimised photos — but re-encoding the same file in the same format is where the floor sits. If a second pass would come back bigger than the original, this tool keeps your original and says already optimal.

Can I compress a whole folder at once?

Select as many files as you like in the file picker, or drag a multi-selection straight onto the page. They process in parallel background workers, and Download all packages every finished file into a single ZIP — duplicate names are de-duplicated automatically.

Why did one of my files come back unchanged?

If re-encoding would have produced a larger file, the original is kept instead and the row is labelled "already optimal". This happens with images that were already compressed aggressively — there is genuinely nothing left to remove, and shipping a bigger file would be a downgrade.

Is my data safe?

Your files are only ever read by your own browser. There is no server-side component that accepts image data. The only network requests the page makes are for the site's own assets and, optionally, the WASM codec modules from a public CDN — never your images.

How do I compress an image to under 100 KB?

Pick Target size, enter 100 and run it. The engine searches for the highest quality that still lands under 100 KB, and only reduces the pixel dimensions if no quality setting can reach the budget — so you keep the resolution whenever the format allows it. It is the same control for 50 KB, 200 KB or 2 MB.

What is the difference between WebP and AVIF?

We measured this rather than repeating the usual figure. Encoding three 2400×1600 photographs to reach the same 40 dB, AVIF needed about 26% fewer bytes than MozJPEG, while WebP came out roughly level with JPEG — a little smaller on two of the three images, and noticeably larger on a highly detailed one. That surprises people, because WebP is usually quoted as 25–50% ahead of JPEG: the gap is real in perceptual metrics and at lower quality settings, but this tool's fidelity floor is defined in PSNR, and MozJPEG is unusually strong there. AVIF is the pick when size is the priority; both keep transparency, and AVIF costs noticeably more encoding time. WebP is supported by every current browser and by most CMSs; AVIF support is now broad but still patchy in older editors and some upload forms.

Why did my PNG barely get smaller?

Usually one of three reasons. The file was already optimised, so there is very little redundancy left to remove. Or it is a photograph saved as PNG, where lossless encoding is the wrong tool — exporting our 3 MB test photograph as WebP or JPEG cut 90% and 87% respectively, which the measured table shows in full. Or it uses the full 16.7 million colours, in which case palette quantization has little to work with; lowering the colour count or switching format is what actually helps.

How do I make my photos small enough to send by email or WhatsApp?

Pick a budget that matches the limit you are hitting — 200 KB for an image that has to survive a chat app or an email preview, 1024 KB for most social uploads, 25000 KB for a plain email attachment — and switch the strategy to Target size. Every image is re-encoded on your own machine to land under that number, so you can bring a whole holiday album down to one consistent size and pull it out as a single ZIP. Nothing is uploaded, and the site does not add a watermark.

How do I make a photo smaller without losing quality?

This is the question people ask most, so it is the one the engine is built around. Auto mode encodes a test pass at several quality levels, scores each against your original, and keeps the smallest file that still clears a ~40 dB PSNR floor — close to the point where differences stop being visible at normal viewing sizes. If you want to move that floor rather than trust a heuristic, Quality mode hands you the slider; if you want certainty instead, export PNG, which discards nothing. The measured table shows what each of those settings actually produced on real files.

Why is my image still too large after I compressed it?

Three usual reasons. The budget you picked was already at or above the file you fed in, so the engine returned your original and labelled it "already optimal" rather than shipping something bigger. Or the format is wrong for the content — a 3 MB photograph stored as PNG cannot be meaningfully reduced losslessly, while the same pixels as WebP or AVIF came out 90% and 93% smaller in our own measurements. Or the image is genuinely already optimised, in which case there is nothing left to remove and the honest answer is to change format rather than to re-encode the same pixels again. The guide to reducing an image size without losing quality sets out what each of those options is worth, measured.

If I shrink the file, does it shrink my resolution too?

Only if it has to. Target size tries quality first and reaches for the pixel dimensions as a last resort, so a 4000 px photo can land under a 200 KB budget without losing a single pixel. The "Resize — maximum edge" option in Advanced is the one that deliberately changes dimensions, and it is off by default. When downscaling does become unavoidable we halve repeatedly instead of shrinking in one step, which keeps edge structure intact and lets the encoder spend fewer bits for the same perceived quality. If you want exact dimensions or a crop rather than a cap, the batch image resizer does that.

Does it work offline?

Yes. Once the page has loaded, compression runs entirely on your machine. Blocking the CDN only means the optional WASM codecs are unavailable; the built-in browser encoders take over automatically and everything else is identical.