Free · no sign-up · no upload
JPEG XL Converter
Turn JPEG, PNG and WebP into .jxl — and .jxl back — without installing libjxl or sending one byte of your image anywhere. Drop a file, read the byte delta, eyeball the same-zoom preview, download.
- 100% in-browser
- Same-zoom A/B preview
- 25 MB / 40 MP safety caps
- Honest when .jxl encoding is missing
1 · Your image
Drop a file or tap to open your photo library. Files stay on this device.
2 · Output settings
3 · Size & preview
No file yet
| File | Bytes | Change |
|---|---|---|
| Original | 0 B | — |
| Converted | 0 B | 0.0% |
Drop an image to see how many bytes the conversion saves.
Preview · same zoom
Previews are capped at 1600 px on the long edge; the downloaded file is always full resolution. On a phone, swipe the preview left/right or use the buttons.
How it works
Three steps, zero uploads, no libjxl install.
Your file is read with ImageDecoder where the browser has it, otherwise createImageBitmap. EXIF orientation is applied when metadata is kept.
PNG, JPEG and WebP come straight from the canvas encoder. .jxl uses a native encoder when one exists, otherwise the libjxl WebAssembly bundle, fetched once and cached by the browser.
Both files are measured in bytes, drawn as stacked bars, placed under a same-zoom A/B preview, and handed back with the original filename and a new extension.
Built for a 30-second size question
There is no upload endpoint at all. The only network request is the one-time JPEG XL encoder bundle (~2 MB) — and even that is only needed for .jxl output.
Byte counts come from the real encoded Blob, formatted with tabular figures, and the delta is signed — a bigger output is reported as bigger, not dressed up.
No native encoder and no WASM bundle means no .jxl — the tool says so instead of writing a mislabelled PNG. Animated and 10-bit files are converted frame 1 only, with a warning.
Panels stack, the preview collapses to an A/B toggle with swipe, and every control keeps a 44 px tap target.
Fast / balanced / max map to libjxl efforts 3 / 5 / 7, so you can trade seconds for kilobytes when the answer matters.
Both previews are capped identically at 1600 px on the long edge, so banding and blocking show up at a fair scale while downloads stay full resolution.
FAQ
Does my image get uploaded anywhere?
No. The tool has no server endpoint and no analytics on your file. Decoding and encoding happen in your browser's own image pipeline, so the bytes stay in the tab. Bookmark it, pull the network cable, and it still converts.
Why does .jxl output sometimes say "encoder unavailable"?
Browsers ship JPEG XL decoding (Safari does; Chrome removed it) but almost none ship encoding. The tool first asks the canvas for image/jxl, then tries to load the libjxl WebAssembly bundle. If both fail — offline, blocked CDN, locked-down browser — it says so and offers WebP or PNG rather than writing a PNG with a .jxl name.
Is the percentage a fair quality comparison?
It is an honest byte comparison of a fresh re-encode against a file that was already compressed. A JPEG at quality 90 re-encoded at quality 90 is a generation loss; a PNG re-encoded to lossless WebP is a clean pair. Read the verdict line and the A/B preview together.
What happens to EXIF orientation and ICC profiles?
With "keep metadata" on, EXIF orientation is applied so a rotated phone photo comes out upright. Canvas encoding normalises colour to sRGB, so wide-gamut and ICC-tagged inputs may shift slightly; that trade is worth a preview check for print work.
Animated or multi-frame JXL, or HDR?
A multi-frame file is converted frame 1 only and the tool tells you how many frames it skipped. 10-bit / HDR frames are flattened to 8-bit sRGB with a warning, because the canvas path cannot carry the wider range.
Why the 25 MB and 40 MP limits?
Decoding a 200 MP image needs about 800 MB just for pixels, which kills a phone tab. Files over those caps are refused before the heavy work starts, with the measured size in the message.