Bulk Image Compressor

Compress a folder of product images before they go to a marketplace, a feed or a page — smaller files, same pixels where you want them, and an honest account of what changed where you don't. No upload, so there is nothing to limit: no 5 MB cap, no 20-file batch, no queue.

🔒 Your data never leaves your browser. Every image is decoded, quantized and re-encoded on your own machine — the compression engines run as WebAssembly inside this page.

🗜️

Drop images or a whole folder here

PNG and JPEG · paste from the clipboard works too · any size, any count

Mode
60
Output

Smart is honest about being lossy

Smart mode does what the famous panda does: it reduces a PNG to a palette of at most 256 colours. Done well, that is invisible on most product photography and graphics, and it is where the 60–80% savings come from. But it is lossy, so this tool measures the loss instead of hand-waving it: every quantized image is compared against the original pixel by pixel, and the result — in decibels of alpha-weighted PSNR — is in the row's details. The quality slider sets the floor. An image that cannot be quantized without landing under your floor is not quantized at all; it drops to the lossless path and the row tells you so.

Lossless mode is the strict version of the promise: pixels are byte-for-byte identical. PNGs lose only render-neutral metadata (comments, timestamps, EXIF) and get their encoding re-optimised; JPEGs are rebuilt without metadata segments while the compressed image data is copied across untouched — no second round of JPEG artefacts, the same technique as our EXIF Privacy Checker.

Never larger, and skipped rather than mangled

Every candidate is compared against your original file, and the original wins ties — a heavily-optimised PNG or an already-recompressed JPEG comes back to you byte for byte with the row saying why. Animated PNGs are detected by their bytes and skipped outright, because flattening an animation into its first frame is not "compression".

WebP and AVIF are opt-in, on purpose

Both formats usually beat PNG and JPEG — and both work in either mode: lossy at the slider quality, or genuinely lossless (verified pixel-for-pixel, including the colour of fully transparent pixels). The default still keeps your input format, because marketplace upload pipelines accept WebP and AVIF unevenly, and a smaller file your platform rejects is worth nothing. Convert when the images are for your own pages. One honest difference from PNG Smart: conversion takes the quality straight from the slider — the measured dB is reported in the row's details, not enforced as a floor.

Why there is no upload, and what that buys you

The compression engines here — a palette quantizer, oxipng and mozjpeg — run as WebAssembly in web workers inside this page. Nothing is transferred, so nothing needs a server, which is why there are no limits to sell you past: no file size cap, no batch size, no daily quota. It also means a 20 MB camera original compresses on your machine at full speed instead of travelling twice over your connection.

Everything this tool does (12 documented behaviours)

IC-P01PNG Smart: palette quantization with a quality floor

Smart mode reduces a PNG to a palette of 32–256 colours, picking the fewest colours whose alpha-weighted PSNR stays above the floor set by the quality slider. Simple graphics drop to few colours; photos stay at 256.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-P02Quantization that would visibly degrade falls back to lossless

If even 256 colours lands under the quality floor, the image is not quantized at all — it goes through the lossless path instead, and the row says so. Gradients and photos with fine texture trigger this.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-P03Every PNG ends with an oxipng pass

Quantized or lossless, the final PNG is re-filtered and re-deflated by oxipng (level 2). On our 12-megapixel benchmark, level 3 saved a further 0.4% but took four times as long — level 2 is the deliberate trade.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-P04Lossless mode strips only render-neutral metadata

tEXt, zTXt, iTXt, eXIf and tIME chunks are removed byte-for-byte; iCCP, gAMA, sRGB, cHRM and pHYs are kept because removing them changes how the pixels render or print. What was stripped is itemised per file.

Source: Chunk semantics per the PNG specification (ISO/IEC 15948): ancillary text/time chunks carry no rendering meaning; colour-management chunks do.

IC-J01JPEG Smart: mozjpeg re-encode, progressive, metadata dropped

JPEGs are decoded and re-encoded with mozjpeg at the slider quality (default ~77), progressive scan order. Metadata does not survive a re-encode from pixels, which is reported as part of the saving.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-J02JPEG Lossless: metadata stripped, compressed data untouched

Lossless mode rebuilds the JPEG without its APP1–APP15 and comment segments. The entropy-coded image data is copied byte for byte — no second round of JPEG artefacts.

Source: Same segment-rebuild approach as this site’s EXIF Privacy Checker; the stripped copy is re-parsed to prove the segments are gone.

IC-G01Never larger: the original wins a tie

Every candidate output is compared against the original file. If nothing is smaller, you get your original bytes back and the row says why. Our gradient benchmark makes even pngquant 31× larger — this path is real.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-G02Animated PNGs are skipped, not silently flattened

An APNG (acTL chunk present) would lose every frame after the first if quantized as a still. It is detected by its bytes and skipped with an explanation instead.

Source: acTL chunk detection per the APNG specification folded into PNG (ISO/IEC 15948:2024).

IC-G03Smart mode decodes via the browser: 16-bit and ICC are flattened

Smart mode reads pixels through the browser decoder, which folds ICC profiles into sRGB and 16-bit channels into 8. The same flattening TinyPNG applies — stated here rather than glossed over. Same-format lossless PNG never decodes, so it is unaffected; converting to WebP/AVIF always decodes, so the flattening applies there too.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-W01WebP output: lossy at the slider quality, or genuinely lossless

Choosing WebP re-encodes with libwebp. In Smart mode the quality comes straight from the slider (no floor search — the measured dB is reported, not enforced). In Lossless mode libwebp runs in exact lossless mode, verified pixel-identical in our corpus, including the RGB values under fully transparent pixels.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-A01AVIF output: strongest compression, biggest engine

Choosing AVIF re-encodes with libaom (speed 6, single-threaded). Smart quality maps more gently than JPEG because AVIF needs fewer quality points for the same look. Lossless mode is true lossless, verified pixel-identical. The 4 MB encoder loads only when AVIF is first selected.

Source: Decided from this project’s own benchmark corpus (docs/tests/image-compressor.md): five synthetic PNG scenarios plus camera-style JPEGs, cross-checked against pngquant 3.0.3 output as a quality reference.

IC-G04Conversion is opt-in because marketplaces are picky

The default output is the input format, unchanged behaviour. WebP and AVIF are smaller but marketplace upload pipelines accept them unevenly — converting by default would hand some sellers files their platform rejects. The never-larger guard applies to conversions too: a WebP that comes out bigger than your PNG is not shipped.

Source: Product decision recorded in this project’s phase-2 spec; platform acceptance varies by marketplace and is not centrally documented, which is exactly why the default stays conservative.

Input stays PNG and JPEG; WebP and AVIF are output formats. The quality reference for the compression strategy is this project's own benchmark corpus, cross-checked against pngquant — the numbers and the way to reproduce them are in the project's test documentation, not taken on faith.