Image Compressor
Your photo is decoded, re-encoded and measured entirely inside this tab. Drag the divider to judge the quality yourself — then download only when you're happy.
Drop an image here
Or click to browse, or paste an image straight from your clipboard. The file you pick is only ever read — Bench writes a new file when you download it, and leaves the original alone.
Choose image JPG · PNG · WEBP · AVIF · GIF (first frame) · SVGBefore & after
Drag the handle · arrow keys work tooThe two images are pixel-aligned, so any softening or banding you see on the right is real compression loss — not a scaling artefact.
- Original
- —
- Compressed
- —
- Change
- —
- Original size
- —
- Output size
- —
Download
Output format
JPEG is smallest for photographs. WebP is typically 25–35% smaller than JPEG at the same perceived quality and is supported everywhere current. PNG is lossless and only worth it for flat graphics, screenshots and anything that needs transparency.
Quality
Around 70–80% is the usual sweet spot: visually indistinguishable at normal viewing size, at roughly a third of the file size. Below 50% you'll start seeing blocking in smooth gradients like skies.
PNG is lossless — the quality slider has no effect. Control size by reducing dimensions instead.
Resize
1920 px covers a full-width image on a 1080p screen. For blog thumbnails, 800 is plenty — and the size saving from halving a dimension is far larger than anything the quality slider will give you.
EXIF is stripped. Re-encoding through a canvas drops GPS coordinates, camera make and model, and timestamps. Useful before posting a photo publicly — but note it also drops the orientation tag, which is why this tool applies rotation before it resizes.
Width first, quality second
The two controls do not do the same kind of work. Quality decides how much of each block's detail the encoder throws away; the width cap decides how many blocks there are. Pixels scale with the square of the width, so halving the dimensions leaves a quarter of the data to encode, and that reduction arrives before the quality dial is touched at all:
4000 × 3000 = 12.0 megapixels a phone photo, untouched
2000 × 1500 = 3.0 megapixels half the width, a quarter of the pixels
1600 × 1200 = 1.9 megapixels the usual web maximum
12.0 -> 1.9 megapixels is 16% of the original data.
The quality slider only affects what is left after that.
A page that shows a photograph at 800 pixels wide is paying for the other 3200 whenever it ships the original. Dropping the width costs nothing a visitor can see, because the pixels being removed were never going to be displayed — and it saves far more than any quality setting short of the point where the image falls apart. Reach for the slider only after the width is honest.
When the file gets bigger, believe the number. A source that was already saved at a low quality by a phone or a content management system has had its detail discarded once already. Re-encoding it at a high setting spends bytes describing texture that is no longer there, and the output can weigh more than the input. The stat line reports the change honestly rather than hiding it. If it stays negative, keep the file you already have.
A second pass cannot cancel the first
Compression loss is cumulative rather than self-correcting. The second encoder starts from pixels that have already been rounded, and it has no way to tell your earlier loss from real detail — it quantises whatever it is handed, so the errors add up instead of washing out. Run the same file through at 60 twice and the second pass costs a generation of artefacts for a few percent of size, because most of what could be removed was removed the first time.
That makes the original the only good starting point. Edit from it, compress from it, and if a file has to go back and forth between tools, keep an uncompressed copy for the intermediate steps rather than a JPEG. PNG is lossless and will not add a generation, which is what an intermediate wants; it is a poor final format for a photograph, which is what the format control is for.
Flat areas fail first
A busy photograph has texture everywhere, and texture gives the encoder somewhere to hide the rounding — small errors land among detail that already looks like noise. A clear sky, a studio backdrop or a panel of one colour has nothing to hide behind, so the same rounding shows up as banding while the rest of the frame still looks untouched. That is why a setting that holds perfectly on one photo can fall apart on another at the same number.
Fine text and thin line art are the other end of it: they need the top of the range, because a single-pixel stroke has no redundancy left to sacrifice. The comparison slider is there for exactly this judgement, and where to drag it is not the middle. Put it over a face, a gradient sky, a pane of glass or a line of small text — the worst region in the frame, not the average one. If the two halves look the same there, they look the same everywhere.
What the encoder leaves behind
Decoding to pixels and re-encoding keeps the picture and drops the file. Exif blocks go, and with them the GPS coordinates, the camera body and lens, the shutter and aperture, and the timestamp — which is a small privacy win before a photo is posted anywhere public. The orientation tag goes too, and since it was the thing telling viewers the image was sideways, it has to be applied to the pixels before it is discarded. This page rotates first and resizes second, so a portrait photo comes out portrait rather than lying on its side.
A few things are lost without anyone intending them to be. An embedded colour profile is dropped unless it is sRGB, so an image in a wide gamut can come back looking flatter than it did. Sixteen bits per channel becomes eight. An animated image loses every frame but the first, because a canvas holds one. None of these are visible in the stat line, which is worth remembering before a file is replaced with its compressed version rather than kept alongside it.
When the picture is going to be published somewhere that accepts a modern format, WebP gets noticeably better results at the same byte budget, particularly around sharp edges and small text. If something downstream insists on JPEG, that is a reason to keep the JPEG, not a reason to re-encode the WebP. To pull the colours out of the photo before it goes up, the Colour Studio will read a palette straight off it.
Reference
What the quality number actually does
| Quality | What it is doing | Where it is the right choice |
|---|---|---|
| 90–95 | Quantisation is barely scaled, so nearly every coefficient survives the round trip. Most encoders still subsample colour even up here, so chroma detail stays coarser than brightness. | Files you will edit again, and images with fine text or thin line art that has to stay legible. The savings are small, and re-encoding an already-optimised file at this setting can leave it bigger than it started. |
| 80–85 | The setting most encoders are tuned around. Texture and edges hold up; faint ringing can appear on hard black-on-white edges at 200% zoom. | Hero images and portfolio photos — anything a visitor might open full screen and study closely. |
| 70–75 | Faint banding starts in skies and studio backdrops. Skin keeps its structure but loses the fine grain that made it read as a photograph. | Photos shown in a feed, card or grid, where they are seen a few hundred pixels wide. |
| 60 | Blocking on smooth gradients becomes visible at 100%, and foliage, hair and fabric start to clump into patches instead of reading as texture. | Images that are always displayed small — a thumbnail, an avatar, an inline diagram — where the bytes matter more than the pixels. |
| 45–50 | Blocking is obvious on a large screen, and ripple spreads outward from high-contrast edges. Small text turns into a smudge. | Previews and placeholders, and photos for a page that has to load on a slow or metered connection. |
| 30 and below | Structure and overall tone survive; little else does. Colour collapses into flat bands and edges pick up halos. | Low-quality image placeholders — the blurred block that stands in while the full file loads — and nothing anyone is meant to study. |
Where a setting lands in this table depends less on the number than on how much fine texture the image holds and how large it will be shown.
The quality number is a dial, not a measurement. Setting it scales the quantisation tables — the instructions that set how coarsely each frequency of the transform is rounded off — and every encoder writes its own. A JPEG at 80 from this page is not the same file as a JPEG at 80 from a camera, so read the rows above as bands rather than values. Quality 100 is not an absence of compression either: the transform still rounds, and the output is often larger than the file you started with.
Flat areas fail first. A panel of one colour, or a graduated sky, has no texture to hide the rounding behind, so banding appears in the 70s while a busy photograph still holds at 60. Fine text and line art need the top of the range. Judge a setting on the worst region — drag the divider across it rather than the middle.
Re-encoding is where it goes visibly wrong. A second pass starts from pixels that have already been rounded, and the encoder cannot tell your earlier loss from real detail — it quantises what is left, and the errors compound instead of cancelling. Compress once, from the original, at the lowest setting that passes your eye at 100%.
Questions
Compression, answered plainly
Where does my image go when I drop it?
Nowhere. The file is read by createImageBitmap(), drawn onto a canvas, and re-encoded in memory. There is no upload step in the code at all — open your browser's network panel while you compress and you'll see no requests leave the page.
Why did my PNG get bigger?
Canvas PNG encoding is lossless but not always as tight as whatever produced the original — especially if the source was already optimised with a tool like pngquant. For flat graphics, WebP lossless is usually the better answer. The stat above will show the increase honestly rather than hiding it.
What happens to transparency?
WebP and PNG keep it. JPEG has no alpha channel, so transparent pixels are filled with white before encoding — otherwise they'd come out black. If you're compressing a logo with a transparent background, switch the format first.
Can I compress several images at once?
One at a time for now. Dropping a second image replaces the first, so the comparison always refers to what's on screen. Batch compression is on the list.
Why is my JPEG or WebP bigger than the file I started with?
Because a lossy encode cannot recover what an earlier one discarded. If the source was already saved at quality 60 by a CMS or a phone, re-encoding it at 90 spends bytes re-describing detail that is gone, and the output can weigh more than the input. Lower the quality to 70–80, or pull the width cap down — both cut bytes in ways the quality setting alone cannot. If the Change figure stays negative, keep the file you already have.
Does compressing the file twice make it smaller?
No, and it usually costs quality for almost nothing. The second pass starts from an image that has already lost its fine detail, so there is very little left for the encoder to remove — you get another generation of artefacts in exchange for a few percent off the size. Start from the original and pick one lower quality setting instead.
What is the comparison slider actually showing me?
The same pixels decoded twice: the left side is the file you loaded, the right side is the encoded output read back, which is exactly what the download button hands you. Both are drawn at the same size and position, so anything you see on the right — blocking in a sky, colour fringing on an edge — came from the encoding rather than the display. It is not a difference map, so nothing is highlighted for you; the judgement is yours to make at 100%.