Compress image to 100KB
Give it a ceiling, not a quality number. The encoder quality is binary-searched and the image is downscaled when quality alone cannot get there, and the size you see is the size you download.
PNG is not offered here: it is lossless, so there is no quality knob to search.
Keeping resolution can make small targets unreachable on large photos — it will say so rather than guess.
createImageBitmap in this tab, drawn onto a canvas, and re-encoded with canvas.toBlob once per search step — all on your own CPU. The download link points at a blob: URL in the same tab. No server, no Pages Function, no model download.Most compressors give you a quality slider and let you guess your way to a file size. This one works the other way round: 100 KB is the input, and the settings are the output. The image is decoded in this tab, drawn onto a canvas, and re-encoded up to a dozen times while a binary search closes in on the highest quality that still lands under 102,400 bytes. If quality alone cannot get there — and on a modern phone photo it usually cannot — the tool steps down a resolution ladder and searches again, because 675x450 pixels at quality 0.7 looks far better than 1500x1000 pixels at quality 0.06 for the same 100 KB. The number you see at the end is measured from the finished blob, not estimated from a formula.
Key facts about Compress image to 100KB
| What 100 KB means here | 102,400 bytes — a binary KB ceiling, checked against the encoded blob's real byte length |
|---|---|
| How the setting is found | 10-step binary search over the encoder quality parameter between 0.05 and 0.95, at each resolution rung |
| Measured example | a 1500x1000 noisy photo of 1.29 MB lands at 101,724 bytes as JPEG — quality 0.56 at 1005x670 |
| Same photo as WebP | 102,342 bytes at quality 0.69 and 825x550 — WebP buys quality, not pixels, at this ceiling |
| Resolution ladder | 13 rungs from 100% down to 8% of the longest side; each rung is ~0.82x the previous one |
| Quality comfort floor | the search keeps shrinking until quality reaches 0.55, or four rungs pass, or the longest side hits 400 px |
| PNG is not offered | PNG is lossless, so there is no quality parameter to search — only resolution, which is a different tool |
| Already under 100 KB | if the file is already smaller and already the chosen format, it is returned byte-for-byte untouched |
| Batch | up to 20 images per run, each searched independently — a 300 KB screenshot and a 6 MB photo get different settings |
| Typical encode count | 11 canvas encodes on one rung, 33-55 when the search walks down two to four rungs |
| Speed | about 200 ms per JPEG search and 0.8-1.5 s per WebP search on a desktop browser |
| When it fails | with resolution locked and a target far below what the encoder floor can produce, it reports the miss instead of shipping an oversized file |
What happens to your file
Nothing is uploaded and nothing is downloaded from a CDN. Your image becomes a blob in this tab, createImageBitmap decodes it with the browser's own decoder, a canvas element receives the pixels, and canvas.toBlob re-encodes it once per search step — every one of those is a browser API running on your own CPU. There is no Pages Function, no API endpoint and no WASM model fetch on this page. The result you download is a blob: URL pointing at memory in the same tab, and closing the tab discards it. Because the search runs locally, the tool also cannot keep a copy: there is nowhere for it to keep one.
About this tool
- 1
Confirm the ceiling
The page opens on 100 KB. The presets and the custom field are there because the same search works for any ceiling, but 100 KB is what this page is tuned and titled for.
- 2
Pick JPEG or WebP
JPEG is universally accepted by upload forms. WebP holds more detail at the same byte count, so choose it when the destination accepts it — on the test photo it kept 825x550 where JPEG had to drop to 1005x670 at lower quality.
- 3
Decide whether resolution may move
Downscale too is the default and is what makes small ceilings look acceptable. Keep resolution locks the pixel dimensions and lets quality take the whole hit — use it when the destination checks dimensions.
- 4
Drop in up to 20 images
Each file is searched on its own, so a batch of mixed sizes does not get one compromise setting applied to all of it.
- 5
Press Compress and read the achieved size
The result strip shows the target, the achieved bytes, the original, and the quality and pixel dimensions the search settled on. Green means under the ceiling.
- 6
Save the file
Each row has its own Save link. The filename carries the target, so photo.jpg becomes photo-100kb.jpg and you can tell the compressed copy from the original in a downloads folder.
| Accepted input | JPG, PNG, WebP, BMP, GIF, AVIF, TIFF and HEIC/HEIF (converted to JPEG first by heic-to) |
|---|---|
| Output formats | JPEG or WebP only — the two canvas encoders that take a quality parameter |
| Per-file ceiling | 50 MB, the shared image cap; the real limit is the canvas, which stops near 16,384 px a side in Chromium |
| Batch size | 20 files per run |
| Target range | 5 KB to 20,000 KB via the custom field; 20, 50, 100, 200 and 500 KB as one-click presets |
| Transparency | alpha is composited onto white before encoding, because JPEG has no alpha channel |
| WebP support | Chrome, Edge, Firefox, Safari 14+; if the browser silently returns a PNG instead, the tool raises an error rather than reporting a wrong size |
| Offline | works with no network once the page has loaded |
| Account or install | none — no signup, no watermark, no per-day cap |
- If the achieved size comes back well under 100 KB, the search hit the top of its quality range — the image was easy, and there is nothing left to gain.
- Screenshots and flat graphics reach 100 KB at high quality without any downscale; photographs of foliage, gravel or crowds are the hard cases because fine noise is expensive to encode.
- Upload forms that say 100 KB almost always mean 100 x 1024 bytes, which is what this uses; a handful mean 100,000 bytes, so set the custom field to 97 KB if a form still rejects the file.
- Turn off Downscale too only when the destination validates pixel dimensions — otherwise you are forcing the encoder to destroy detail it did not need to.
- Crop before compressing. Removing a dead border takes bytes away without touching a single remaining pixel's quality.
- For a batch of product shots, run once at 100 KB with WebP and once with JPEG and compare the two result strips — the quality figures make the trade-off explicit.
- Binary search on encoder quality, not a guessed slider
- Automatic downscale ladder when quality alone cannot reach
- Measured achieved size, never an estimate
- JPEG and WebP output with a verified MIME type
- Batch of 20, each file searched independently
- Honest could-not-reach state instead of an oversized file
- Meeting the 100 KB per-image ceiling that many CMS and forum upload forms enforce.
- Getting a set of product photos under a marketplace's per-image limit without hand-tuning each one.
- Preparing hero images for a page-speed budget where 100 KB is the agreed cap per asset.
- Attaching several photos to an email that bounces above a total size.
- Fitting scanned supporting documents into an application portal that rejects anything larger.
- Cutting a folder of phone photos down before syncing them to a device with little storage left.
Related tools
View allWorks well with this6
More in Images12
Updated