Compress PNG and JPEG, or convert to WebP — free, in your browser.
Drop images here
or click to browse, or paste
PNG or JPEG, up to 40 megapixels each
Compressed on this device. Your images are never uploaded.
How it works
For each image the compressor searches palette sizes from 2 to 256 colours, with and without dithering, scores every candidate with SSIMULACRA2 — a perceptual metric where 90 is indistinguishable from the original at 1:1 — and keeps the smallest file that still looks right. There is no quality slider, because picking the quality is the part you should not have to do.
It runs as WebAssembly in a worker thread, using every core of your machine. That is why there is no upload step and no file limit: the work happens on hardware you already paid for.
Against some other compressors
180 PNGs — icons, UI screenshots, illustrations, photos, cut-outs, 3D renders — scored with SSIMULACRA2. Each other tool got its best of ten settings per image, picked after the fact. Figures are from the 71 images held out of tuning.
| Compressor | Points vs TinyPNG | Images reached |
|---|---|---|
| This site | +1.7 | 67 / 71 |
| TinyPNG | 0 | 71 / 71 |
| pngquant | 0.0 | 53 / 71 |
| quantizr | −0.1 | 39 / 71 |
| ImageMagick | −11.3 | 3 / 71 |
| Pillow | −16.8 | 4 / 71 |
At the same quality, the median image comes out 8–12% smaller than TinyPNG's PNG and 12–14% smaller than its JPEG. Benchmarks and source: pngdeer, MIT licensed.
Compared in detail: TinyPNG, Squoosh, iLoveIMG.
Questions
Is there a file limit? 40 megapixels per image, and 30 megapixels in total for an animated PNG. That ceiling is the browser's memory, not a quota. Everything else is unlimited and free.
Where do my images go? Nowhere. There is no server that receives them; the page has no upload code. You can watch it work with the network panel open.
What comes out? PNG stays PNG, JPEG stays JPEG, and animated PNG keeps its frames and timing. The WebP page turns either into WebP instead.
Is it really the same as the command line tool? Yes — the same Rust code compiled twice, which is why the browser and the CLI write identical bytes.