Compress images and GIFs without uploading them anywhere
Drop in JPEG, PNG, WebP or animated GIF. Everything — decoding, resizing, quantising, re-encoding — happens inside this tab. There is no server to send your pictures to, no account to make, and nothing to pay. Close the tab and every trace is gone.
Drop images here
or , or paste from the clipboard
Up to 60 files at a time, 25 MB each. Nothing to hand? , , , or .
Settings
GIF stays GIF; converting an animation to a still format exports the first frame and says so.
JPEG and WebP only. Every attempt re-encodes from the original decode, so nudging this never stacks damage.
PNG has no quality dial — its size lever is the palette. Transparency survives quantisation.
Applied per frame, so a palette is spent on the colours each frame actually uses.
Appended before the extension. Leave blank to keep the original name.
Watermark
What this actually does
A browser canvas will happily re-encode a JPEG or a WebP at a quality you pick, and that covers most of the job. It falls down in two places, and this app fills both in by hand.
-
PNG has no quality dial. The canvas writer always emits 8-bit truecolour and
ignores any quality argument, so a PNG "quality" slider layered on top of it is decoration.
The real lever is the palette, so Pic Lite quantises with median cut, optionally dithers with
Floyd–Steinberg, and writes the file through its own PNG encoder — sub-byte index packing,
adaptive scanline filtering, and
tRNSso cut-outs stay cut out. -
The canvas cannot write a GIF at all. There is no GIF encoder behind
toBlob, and decoding one hands back a single still. So the GIF path here is its own reader and writer: LZW both ways, disposal handled properly, a fresh palette per frame, and only the rectangle that changed sent on each frame.
Nothing is compiled in. There is no WebAssembly codec, no mozjpeg, no
oxipng — this platform only admits binaries from a vetted allowlist and no image
codec is on it. Everything above is plain JavaScript over typed arrays, and you can read all of
it: compress.js, quantize.js,
pngenc.js, gifcodec.js,
metastrip.js, watermark.js,
encoder.js, worker.js,
pipeline.js, zipenc.js,
download.js, report.js,
history.js, examples.js,
app.js.
Where it will not beat a dedicated tool
The JPEG and WebP encoders are the browser's, not mozjpeg's, so a
already-well-optimised JPEG may not shrink much further — when that happens the app tells you
it kept your original rather than handing back something bigger. Progressive JPEG output is not
offered because the canvas does not expose it. Lossless PNG re-crushing (the thing
oxipng does) is only partly reproduced: the encoder picks filters adaptively and
packs indices tightly, but it does not brute-force filter strategies.