All articles

JPG Quality Settings Explained: What 75, 85, 95 and 100 Change

The JPG quality number is not a percentage. What it controls inside the encoder, what each step costs in file size on a measured photo, why 100 is not lossless, and whether re-saving does damage.

Disclosure: Save Image As Type is ours, and this blog is published by the same people. Anything said here about our own software is written by an interested party. The quality defaults named below are our own extension's, read from its source, and one paragraph points out that our settings page labels the value with a percent sign it has not earned. Every measurement was made in Chromium's canvas encoder, which any in-browser converter in Chrome or Edge uses, ours included.

What does the JPG quality number mean?

The JPG quality number is an instruction to the encoder about how coarsely to round the image data. It is not a percentage of anything. A file saved at 90 does not hold 90% of the original, and a file saved at 50 is not half as good as one saved at 100.

A JPG encoder cuts the picture into small blocks and describes each block as a mix of patterns, from broad gradients down to fine detail. Each of those values is then divided by a number from a table and rounded. Big divisors round away more detail and leave a smaller file. That table is called the quantization table, and the quality setting scales it. In the words of the reference encoder’s documentation, the switch exists to “scale quantization tables to adjust image quality”.[1]

The conversion from the number you type to that scale is one small function in libjpeg-turbo, the JPEG library that Chrome and Firefox both use.[3] The standard table is used as it is at quality 50. Above 50, the table is scaled to 200 - 2 x quality percent. Below 50, to 5000 / quality percent.[2]

QualityDivisors, as a share of the standard table
25200%
50100%
7550%
8530%
9020%
9510%
992%
100every divisor is 1

Read down the right-hand column and the shape of the scale appears. From 50 to 75 the rounding gets twice as fine. From 90 to 95 it gets twice as fine again, in five steps instead of twenty-five. From 95 to 99 it gets five times finer. The top of the scale is where the encoder is asked to keep detail that is smaller and smaller, and that detail is expensive to store.

Quote card: A file saved at 90 does not hold 90% of the original, and a file saved at 50 is not half as good as one saved at 100.
The number sets how coarse the rounding is, and the scale is not even.

Our own extension gets this wrong in one place. Its settings page shows the value as “95%”. The percent sign is shorthand for “95 on a scale of 100”, and it suggests exactly the reading this section argues against.

How much file size does each quality step cost?

On the photograph we measured, the file grows slowly up to about 85, more than doubles between 85 and 95, and quadruples between 95 and 100.

The test, run on 11 October 2026 in Chromium 151 on an Apple M3 Pro: a 1600 x 1067 photograph of a stack of printed photos, scaled down from a 5235 x 3491 camera original and held as a lossless PNG. The page drew it to a canvas and saved it as JPG at each quality through the browser’s own encoder. PSNR is a standard fidelity measure, in decibels, computed here over every red, green and blue value against the PNG. Higher means closer to the source, and it is a crude instrument: it counts numerical error and knows nothing about what an eye notices.

QualityFile sizeVersus quality 85PSNR
5045.1 KB0.36x39.9 dB
6053.3 KB0.42x40.3 dB
7068.1 KB0.54x40.9 dB
7578.7 KB0.62x41.2 dB
8097.5 KB0.77x41.7 dB
85126.3 KB1.0x42.2 dB
90181.8 KB1.44x42.9 dB
95322.1 KB2.55x44.0 dB
97461.3 KB3.65x45.2 dB
99721.2 KB5.71x47.3 dB
1001.31 MB10.6x50.2 dB

Compare two moves of about the same fidelity gain. Going from 60 to 85 adds 73 KB and 1.9 dB. Going from 85 to 95 adds 196 KB and 1.8 dB. The second move buys slightly less and costs nearly three times as much. Going from 95 to 100 adds another megabyte.

That matches what the encoder’s own documentation says about the top of the range: a value above about 95 “will increase the size of the compressed file dramatically”, and the gain is measurable with metrics such as PSNR but “rarely perceivable by human vision”.[1]

Your numbers will differ. This photograph has a soft, out-of-focus background, which compresses well. A picture full of sharp texture, such as foliage or fabric, produces larger files at every setting. The shape of the curve should hold, because it comes from the scaling table above.

Is quality 100 lossless?

No. Quality 100 is the least lossy setting a JPG has, and it still changes the picture. At 100 every divisor in the table is 1, which removes the rounding loss from that one step, “but there is still information loss in subsampling, as well as roundoff error”.[1]

Our quality 100 file confirms it. It was 1.31 MB and its pixels were not the source’s pixels: individual colour values were off by up to 4 levels out of 255. That error is far too small to see. It is also not zero, so the file is not a lossless copy.

Chrome and Edge do one more thing at exactly 100. Their canvas encoder stores colour at half resolution at every quality below 100 and at full resolution only at 100, while Firefox makes that switch at 90, and no standard says where the line belongs.[5] That switch is a large part of why the file jumps between 99 and 100, and why a converted image can come out bigger than the original walks through it with its own numbers.

If you need the exact pixels back, JPG is the wrong container at any setting. PNG is lossless by design, and it is the right choice for a picture you plan to edit again.

Does saving a JPG again make it worse?

Less than its reputation says, as long as nothing else changes. We took the quality 85 file and saved it again at 85, twenty times in a row, each save starting from the previous file.

Saves at the same qualityQuality 85: size, PSNRQuality 95: size, PSNR
1126.3 KB, 42.2 dB322.1 KB, 44.0 dB
2126.6 KB, 42.2 dB324.6 KB, 43.9 dB
5126.6 KB, 42.1 dB325.0 KB, 43.7 dB
10126.6 KB, 42.1 dB325.0 KB, 43.5 dB
20126.5 KB, 42.1 dB324.9 KB, 43.4 dB

After twenty generations the quality 85 file had lost a tenth of a decibel. The quality 95 chain lost more, 0.6 dB, and most of that in the first ten saves. Neither is the visible decay people expect. The reason is that the second save divides by the same table as the first. Values that were already rounded to multiples of those divisors mostly land on the same multiples again, so there is little left to lose.

The damage people remember comes from saves where something did change:

  • A different quality. A new table means every value is rounded afresh.
  • A crop or a resize. The 8 x 8 blocks no longer line up with the old ones, so the encoder starts from scratch on an image that already carries the first save’s errors.
  • A different program. Two apps rarely share a table, even at the same number.
  • An edit. Brightness, a filter, text on top: all of them change the pixels before the next rounding.

So the working rule is narrower than “never re-save a JPG”. Keep the editing master in a lossless format and export a JPG once at the end. A plain save of an untouched JPG at its own quality is close to harmless. Our extension avoids even that: a JPG saved as JPG with no resize is written straight through from the original bytes with only its metadata removed, and no second encode.

Is the WebP quality number the same scale?

No. WebP uses a different compression method, and its 0 to 100 is a separate scale that happens to share the range. The same photograph, the same browser, both formats:

QualityJPGWebP
7578.7 KB, 41.2 dB29.2 KB, 40.4 dB
85126.3 KB, 42.2 dB52.4 KB, 41.4 dB
90181.8 KB, 42.9 dB100.4 KB, 42.3 dB
95322.1 KB, 44.0 dB213.8 KB, 43.7 dB
1001.31 MB, 50.2 dB1.64 MB, identical to the source

At the same number the WebP is smaller and a little further from the source. Matched on fidelity instead, WebP at 90 lands next to JPG at 85 and is about a fifth smaller. The last row breaks the pattern. In this run, WebP at 100 came out pixel-for-pixel identical to the PNG, a lossless file larger than any of the lossy ones.

This is why a converter with separate sliders per format is doing something useful, and why one number applied to both is a compromise. In our extension the defaults are 95 for JPG and 90 for WebP, and each has its own slider under Quality Settings.

Why does the same number give a different file in another app?

Because the number has no definition outside the encoder that reads it. The web standard that browsers follow describes it only as “the desired quality level for the resulting image”, a number between 0.0 and 1.0, with nothing about what a given value must produce.[4] A web page that does not pass a value at all gets whatever default that browser picked.[6]

Desktop software has more room still. An app can ship its own tables, map its slider onto them however it likes, and make its own choice about colour resolution. A “quality 10” in one photo editor’s 0 to 12 scale has no fixed relation to 85 anywhere else. Even two tools with a 0 to 100 scale disagree: in a batch test for bulk converting images without uploading, macOS sips and ImageMagick were both asked for 85 and produced files 1.7 times apart.

The practical consequence: a quality number is a setting to learn per tool. When a file has a size limit to meet, save one image, look at the result, and adjust.

Which quality setting should you use?

What the JPG is forSettingWhy
A web page, an email, a chat, a listing photo80 to 85The steep part of the curve has not started
A download you intend to keep90 to 95Up to two and a half times the bytes of 85, with margin for one later edit
A photograph you will edit againDo not use JPGKeep a PNG and export once
A screenshot, a diagram, textDo not use JPGPNG is smaller and exact for flat colour
A thumbnail or a contact sheet60 to 70Small on screen, so the loss stays hidden
Any photographNot 100Ten times the size of 85 in our test, still lossy

The encoder’s authors put the useful range for photographs between 50 and 95, and suggest starting lower and moving up “5 or 10 counts at a time” until the picture looks right.[1] That advice has aged well. A high default makes sense for a converter that cannot know what you are saving or why, and it is worth lowering once you do know.

The quality number is one of three things that decide a JPG’s size. The other two are the pixel dimensions and how much fine detail the picture contains, and the first of those is often the bigger lever: half the width and height leaves a quarter of the pixels. If the reason you are here is a WebP that needed to become a JPG, saving a WebP as JPG covers the steps and the WebP problem, end to end covers the format.

Sources

  1. libjpeg-turbo: usage.txt, the -quality switchPrimary source

    That the quality switch scales the quantization tables, runs from 0 (worst) to 100 (best) with a default of 75, should generally be between 50 and 95 for photographic images, that quality 100 generates a quantization table of all 1's while information is still lost in subsampling and roundoff, and that a value above about 95 increases file size dramatically for a gain that is measurable but rarely perceivable by human vision.

  2. libjpeg-turbo: jcparam.c, jpeg_quality_scaling()Primary source

    That a quality rating is converted to a percentage scaling factor for the quantization table: the basic table is used as-is for a quality of 50, qualities 50 to 100 become a scaling percentage of 200 - 2*Q, qualities 1 to 50 become 5000/Q, and at Q=100 the scaling is 0, which makes all the table entries 1.

  3. libjpeg-turbo: software that uses libjpeg-turboPrimary source

    That Google Chrome, from version 11, and Mozilla Firefox, from version 5.0, are among the software that uses libjpeg-turbo. Read .

  4. HTML Standard, 4.12.5.5 Serializing bitmaps to a filePrimary source

    That the quality argument a web page passes to the browser's image encoder is a number in the range 0.0 to 1.0 inclusive indicating the desired quality level for the resulting image, with no definition of what any particular value must produce.

  5. WHATWG HTML issue 5395: Standard for chroma subsampling based on encode qualityPrimary source

    That Chromium's canvas JPEG encoder only disables chroma subsampling at quality 100, while Firefox treats a quality of 90 or above as a request to disable it, and that no standard defines the threshold. Read .

  6. MDN: HTMLCanvasElement.toDataURL()Primary source

    That the quality value applies to file formats that support lossy compression, such as image/jpeg or image/webp, and that a user agent uses its own default quality value when the option is not specified.

Related reading

Title card reading "WebP will not open in Windows Photos"

WebPJPG

WebP Will Not Open in Windows Photos: What Windows Is Actually Missing

13 min read

Title card reading "The WebP Problem: why your downloads will not open"

WebPJPG

The WebP Problem: Why the File Will Not Open, and the Fix

13 min read

Title card reading "How to Save WebP Images as JPG"

WebPJPG

How to Save WebP Images as JPG

5 min read