JPEG Quality Checker
Find out what quality setting a JPG was saved at. The number is not stored in the file, but its fingerprint is: encoders scale the standard JPEG quantization tables by a factor derived from the quality, so reading those tables back and comparing them to the standard recovers it. You also get the dimensions, bits per pixel, chroma subsampling, whether the file is baseline or progressive, and which metadata blocks it carries. Nothing is uploaded.
Drop JPG files here
JPEG only — this reads the actual markers inside the file
How to check a JPEG's quality
- Drop in the JPGs.
- Click Analyse. Each file gets an estimated quality on the 1–100 scale, plus a note on whether the tables match a standard encoder exactly.
- Read the bits-per-pixel figure alongside it — under 0.5 bpp usually means visible artefacts regardless of what the tables claim.
Reading the result
- 95–100 — near-lossless, and almost always larger than it needs to be. Re-saving at 82–85 typically halves the file with no visible change.
- 80–94 — the normal publishing range. Little to gain from touching it.
- 60–79 — moderately compressed. Fine as a final file; a bad starting point for editing, because every artefact gets amplified.
- Below 60 — heavily compressed. Blocking and ringing are baked in, and no re-save at a higher quality can remove them. If this is a photo you care about, find the original.
Why you would want to know
Three practical reasons. Before editing: a low-quality source will fall apart under adjustment, so it is worth knowing before you spend an hour on it. Before re-compressing: re-saving a quality-70 file at quality-90 makes it bigger without making it better, which is the single most common wasted step in image work. When judging a supplied file: a stock image or a client asset that arrives at quality 55 and 0.3 bpp is not print-ready, whatever the dimensions say. Pair this with Compare two JPGs when you want to see what a re-encode actually cost you, measured in PSNR and changed pixels.
FAQ
How can the quality be worked out at all? Isn't it discarded?
The number itself is never stored — but its effect is. Encoders take a standard pair of quantization tables (published in Annex K of the JPEG spec) and scale them by a factor derived from the quality setting, then write the scaled tables into the file. Reading those tables back and comparing them cell by cell to the standard recovers the scale factor, and from that the quality. It is arithmetic, not guesswork.
What does "exact match" mean in the result?
That the tables in your file are byte-for-byte what libjpeg would produce at the reported quality. That is a strong signal: the file was written by a libjpeg-family encoder (GIMP, PIL, most cameras, most PHP and Java pipelines) at exactly that setting. When it says "approximate", the encoder used custom tables — Photoshop, mozjpeg, Google's Guetzli, and many phone ISPs all do — and the number is a best fit rather than a recovered setting.
Should I re-save a high-quality JPG at a lower quality?
If it is going on the web, usually yes: files saved at 95+ are typically twice the size of the same image at 82 with no visible difference. But re-encoding always costs something, so do it once, from the highest-quality original you have, rather than repeatedly. Compress JPG can target a specific quality or an exact size in KB.
What is chroma subsampling and should I care?
JPEG can store colour at a lower resolution than brightness, because the eye is less sensitive to it. 4:2:0 halves it on both axes and is the norm for photographs — invisible and a substantial saving. 4:4:4 keeps full colour resolution, which matters for screenshots, text, graphics, and anything with saturated red edges, where 4:2:0 produces visible colour bleeding.
Baseline or progressive — which is better?
Progressive files are usually a few percent smaller and render as a whole-image blur that sharpens, which feels faster on a slow connection. Baseline paints top to bottom. Both are universally supported; progressive is the better default for the web. A browser canvas can only write baseline, so anything re-saved by a browser tool comes out baseline.