ExactSize

Picture file size reducer: what the second pass saves, and what it costs

Everyone who reduces a picture file asks the same follow-up: it is still too big — do I just run it again? This page answers it with one photograph, six budgets, and six second passes. Run the same target twice and the file comes back untouched — 202,286 bytes again, every one of the 6,000,000 pixels identical. Ask for a deeper target and the second pass lands within 220 bytes of what a single pass returns, while spending pixels and a little quality to get there. The second pass is not harmful; it is just nearly free of benefit and not free of cost.

Three numbers worth having before you compress twice

  • Same target twice: nothing moves. The 200 KB output (202,286 bytes, 3000 × 2000) run again at 200 KB returned 202,286 bytes, 3000 × 2000, mean difference 0.00, 100% of pixels bit-identical. The same held at 60 KB (61,310 bytes) and 20 KB (20,385 bytes), each in 0 ms of encoder time. The verdict line says it plainly: the file was already inside the limit.
  • Deeper target from a reduced file: bytes match a single pass, pixels do not. From the 200 KB file, 100 KB returned 102,043 bytes against 102,087 direct — 44 bytes less, 0.04% — but 2460 × 1640 = 4,034,400 pixels against 4,107,710 direct, 73,310 fewer. From the 60 KB file, 30 KB returned 30,563 vs 30,716 bytes direct. From the 20 KB file, 10 KB returned 9,990 vs 10,210 — 220 bytes less — yet 623 more pixels. The byte number is not where the two routes differ.
  • Every extra pass adds a small, repeatable quality bill. Mean per-channel error against the untouched original: 1.961 direct at 100 KB vs 2.089 via the 200 KB file (+0.128); 2.498 direct at 30 KB vs 2.622 via the 60 KB file (+0.124); 3.110 direct at 10 KB vs 3.221 via the 20 KB file (+0.111). Roughly a tenth of a level per extra pass, on a 0–255 scale.

One 689,299-byte photograph, six budgets, six second passes, one browser, one session. Measured 4 November 2026.

How to read these numbers: every row is this site's own compressor driven through its published interface, one run per row, each run in a fresh tab so no state carries over. Bytes were read three ways — the tool's own report, a FileReader read of the returned blob, and the saved file on disk — and agreed on every row; dimensions were read via createImageBitmap and an image element and agreed on every row. "Mean error" is the average absolute per-channel difference on the 0–255 scale, measured against whichever source the row names, upscaled back to that source's frame. Whatever phrasing brought you here — reduce image size, shrink the file, make it fit — the outcome lands in one of the two columns every table below tracks: bytes and pixels. The ladder of single-pass budgets lives on the KB ladder; what one pass leaves of your quality is on the 200 KB page.

The first pass: one photograph, six budgets

The source is a 3000 × 2000 night photograph, 689,299 bytes. Each row is one run at one byte target, JPG output. This is the baseline the second passes are measured against — and three of these rows reproduce, byte for byte, what the same file produced on earlier sessions on this site (202,286 at 200 KB, 102,087 at 100 KB, 61,310 at 60 KB, 20,385 at 20 KB), which is worth knowing: the reducer is deterministic, so a second pass measured tomorrow would land on these exact numbers.

Target Output bytes Output Output px Quality Mean error
200 KB 202,286 3000 × 2000 6,000,000 58.28% 1.552
100 KB 102,087 2482 × 1655 4,107,710 40.47% 1.961
60 KB 61,310 1831 × 1221 2,235,651 40.47% 2.178
30 KB 30,716 1230 × 820 1,008,600 40.47% 2.498
20 KB 20,385 968 × 646 625,328 40.47% 2.701
10 KB 10,210 623 × 415 258,545 41.41% 3.110

3000 × 2000 photograph, 689,299 bytes, one run per target, JPG output. Mean error is against this photograph. Encoder time ran 940 ms (10 KB) to 5,436 ms (100 KB).

Note where quality sits. At 200 KB it is 58.28% — the budget was generous enough to pay quality. At every target from 100 KB down it is pinned at 40.47% (41.41% at 10 KB), the floor this compressor will not go under. Below that floor the only lever left is pixels, which is why the outputs shrink from 6.00 MP to 0.26 MP while the quality figure does not move. That floor is also the reason the second passes behave the way they do below.

Same target twice: the reducer refuses, and that is correct

Take each output and run it again at the target it already meets. Nothing is re-encoded. The three rows below are the whole finding; the error columns are measured against the file fed in, which is the first-pass output itself.

File fed in Target Bytes back Dimensions Mean error vs input Identical px Encode time
202,286 B (the 200 KB output) 200 KB 202,286 3000 × 2000 0.000 100% 0 ms
61,310 B (the 60 KB output) 60 KB 61,310 1831 × 1221 0.000 100% 0 ms
20,385 B (the 20 KB output) 20 KB 20,385 968 × 646 0.000 100% 0 ms

Same-target repeats. The verdict line on all three reads "the file was already inside your limit". Bytes, dimensions and every pixel come back unchanged.

This is the row that saves people from a fear they did not need to have. The folklore says re-compressing a JPEG piles damage on damage — true when a tool re-encodes unconditionally. This one does not: a file already inside the target is checked and returned, 202,286 bytes in and 202,286 bytes out, with 100% of pixels bit-identical. There is no generation loss on a pass that never encodes. The practical corollary: if you re-run a compliant file through a reducer and the byte count changes, that tool re-encoded your pixels to no purpose, and the difference is pure damage or pure bloat.

Going deeper from a file you already reduced

The interesting case: the 100 KB form field when the file in hand is the 200 KB output. Should you have compressed once to 100 KB? The table pairs each second pass with the direct run at the same target, same source photograph, same session.

Route to the target Bytes Output Output px Δ px vs direct Δ bytes vs direct
100 KB, direct from the original 102,087 2482 × 1655 4,107,710 — —
100 KB, from the 200 KB file 102,043 2460 × 1640 4,034,400 −73,310 −44
30 KB, direct from the original 30,716 1230 × 820 1,008,600 — —
30 KB, from the 60 KB file 30,563 1223 × 815 996,745 −11,855 −153
10 KB, direct from the original 10,210 623 × 415 258,545 — —
10 KB, from the 20 KB file 9,990 623 × 416 259,168 +623 −220

Three second passes against their direct equivalents. Byte differences: 44 ÷ 102,087 = 0.043%; 153 ÷ 30,716 = 0.50%; 220 ÷ 10,210 = 2.15%.

Read the byte column first: the second pass buys almost nothing. 44 bytes is four ten-thousandths of the file. Even the largest gap, 220 bytes at the 10 KB target, is 2.15% — and this compressor rounds its search well inside that margin. If your reason for a second pass is bytes, there are no bytes here.

The pixel column is where the routes actually diverge, and not in one direction. At 100 KB the second pass gave up 73,310 pixels (1.78%); at 30 KB, 11,855 (1.18%); at 10 KB it handed back 623 more pixels — 623 × 416 instead of 623 × 415 — for 220 fewer bytes. The size search walks down in steps from wherever the input already is, so where it lands depends on the starting frame, not on any property of the target. That is the same non-monotone landing this site measured on the 60 KB page across starting resolutions; here it shows up across starting files.

The generation-loss bill, measured against the original

The comparisons above are against each run's own input. This table re-anchors everything to the one file that never changed: the untouched 689,299-byte original, at its full 3000 × 2000 frame. Each output was decoded, scaled back to 3000 × 2000 and compared pixel by pixel, through two independent decode paths.

Output Bytes Mean error vs original Max diff Cost of the extra pass
100 KB, direct 102,087 1.961 36 —
100 KB, via 200 KB 102,043 2.089 43 +0.128 (+6.5%)
30 KB, direct 30,716 2.498 56 —
30 KB, via 60 KB 30,563 2.622 60 +0.124 (+5.0%)
10 KB, direct 10,210 3.110 70 —
10 KB, via 20 KB 9,990 3.221 70 +0.111 (+3.6%)
200 / 60 / 20 KB, second pass at the same target 202,286 / 61,310 / 20,385 1.552 / 2.178 / 2.701 26 / 48 / 65 +0.000 — no re-encode

Every figure against the untouched 689,299-byte original. Two decode paths (createImageBitmap and an image element) agreed to within 0.036 levels on every row; the direct-run errors are identical to the first table, as they must be — same runs.

The bill is remarkably flat: +0.128, +0.124, +0.111 — call it a tenth of a level per extra pass, a 3.6% to 6.5% relative worsening, at three different depths. The worst single-channel difference rose from 36 to 43 at the 100 KB route and from 56 to 60 at 30 KB. This is one extra pass, one photograph, one encoder; three extra passes would be three bills, and this page does not claim to know their sum. What it does claim: the pass you skip is the tenth of a level you keep, and the bytes you save by skipping it are the 44 to 220 above — which is to say, skipping costs you nothing that matters and saves quality that the table can see.

Why the bill is this small at all: the second encode quantizes coefficients that the first encode already flattened toward the same 40.47% floor, so there is simply not much new damage available. That sentence is interpretation, not measurement — the measured part is the three deltas, and they are the numbers to plan around. What changing format instead of re-compressing buys at the same byte count is a different page with different numbers.

What "compress image size" is actually reducing

People arrive at a reducer with any of three sizes in mind, and the tool only ever controls one of them directly. File size is the bytes — the number the upload form checks. Image size is often meant as the pixel dimensions — 3000 × 2000 becoming 1831 × 1221. Display size is neither; it is what a page or a printer does with the pixels afterwards. The order this reducer spends its levers in is quality first, pixels second, and quality has a floor: from the table above, 200 KB kept all 6,000,000 pixels and paid 58.28% quality, while 100 KB and below kept paying in pixels because quality had hit 40.47% and stopped. So whether the form says compress image size or file size, what you are really choosing is which of the two reserves — quality or pixels — the byte budget drains first, and at typical web budgets below 100 KB it is pixels. The full sweep of budgets on one page is the KB ladder.

JPEG twice: why the second encode is this cheap

Every run on this page is JPEG into JPEG — which is the honest condition for the question, since a "reduce jpg file size" second attempt always starts from a file the first attempt already encoded. Three measured facts describe what that means here. First, the same-target repeats changed nothing at all: no second JPEG generation exists to lose quality from. Second, the deeper-target passes each cost +0.111 to +0.128 mean levels against the original — real, but small next to the 1.961-to-3.110 spread the byte budget itself causes across the target range. Third, the second pass reproduced the same quality figure, 40.47%, that the direct pass chose: both encodes were working at the same floor, so the second pass was not "more compression" in the quality sense — it re-quantized an already-floor-quality file to a smaller frame. As a jpeg size reducer asked to go lower, that is the behaviour you get: same floor, smaller picture, a tenth of a level further from the original. If the file must stay JPEG and the damage budget matters, the lossless route — re-encoding the container without touching a pixel — is measured on the PNG size reducer page, whose discipline transfers even though the format does not. For the same first pass split into Y, Cb and Cr channels, see the JPEG size reducer page.

Quality as the budget: the reducer read the other way

Some people searching for an image quality reducer want the mirror operation: keep the bytes roughly fixed and spend quality. This tool does not take a quality input — it takes a byte target and reports the quality it had to spend. But the same six runs read in that direction tell you what each byte budget costs in quality on this photograph: 58.28% at 200 KB, then a wall at 40.47% from 100 KB down to 20 KB. The wall is the interesting fact. Between 200 KB and 100 KB you give up 17.8 quality points (58.28 − 40.47) for 100,199 fewer bytes; between 100 KB and 10 KB you give up essentially none, because quality cannot go lower and pixels pay instead. So if quality is what you are rationing, targets at or above the wall are where the trade actually happens, and everything below the wall is a pixel decision wearing a quality label. The second-pass bill from the table above is the same story from the other side: an extra pass spends a tenth of a level and buys back almost no bytes.

Online, in this tab: what "photo compressor online" means here

This is a photo compressor online in the literal sense — it runs in the browser — but the processing never leaves your machine. The picture is decoded, re-encoded and returned inside the tab; no request carrying it goes to a server. That is also why the same-target repeats could answer in 0 ms: the check is a local comparison against the file you already handed over, not a round trip. And it is why this page's numbers reproduce: the same input bytes with the same target return the same output bytes — 202,286 at 200 KB, 102,087 at 100 KB, 61,310 at 60 KB, 20,385 at 20 KB, matching this site's runs from previous sessions on the identical photograph. A reducer you can re-run is a reducer you can verify, and every number above is one run deep in a browser anyone can open.

How to reduce a picture file without the second pass

  1. Decide the final number first. The second pass on this page happened because the first target (200 KB) turned out to be the wrong one. Check the limit before the first run, not after.
  2. Set the target, drop the file, read the verdict. Bytes and dimensions are both on the result line, with the reason — quality paid or pixels paid.
  3. If the file came back "already inside your limit", stop. Running it again at the same target returns the identical file; the 0 ms rows above are that check.
  4. If you must go lower, go straight from the original. One pass to 30 KB sits 0.124 mean levels closer to your photograph than the same 30 KB reached through 60 KB. The bytes are the same; the pixels and the damage are not.

Questions this page gets

Does compressing a picture twice lower the quality?

By a small measured amount, and only when the second target is deeper. Against the untouched original: direct 100 KB measured 1.961 mean levels of error, the same 100 KB via a 200 KB file measured 2.089 (+0.128); 30 KB was +0.124 via 60 KB; 10 KB was +0.111 via 20 KB. Same-target repeats cost nothing — the file is returned without being re-encoded.

Why did my picture file come back the same size?

It was already inside the target. At 200 KB, 60 KB and 20 KB, compliant files came back byte-identical, dimension-identical, 100% of pixels bit-identical, with the verdict "the file was already inside your limit" and 0 ms of encoder time. Nothing ran, so nothing changed.

Is it better to compress once to the final size or in two steps?

Once. Two steps matched the bytes within 220 bytes (102,043 vs 102,087; 30,563 vs 30,716) but landed 0.111 to 0.128 mean levels further from the original, and gave up 73,310 pixels at the 100 KB route. The byte saving for all that was 44 and 153 bytes.

Will running it again make the file smaller than the target?

No. The 200 KB output run again at 200 KB returned 202,286 bytes; the 60 KB and 20 KB repeats returned 61,310 and 20,385. The reducer stops at the target rather than pushing past it — smaller means setting a smaller target, not repeating the same one.

Does "picture file size reducer" work differently on .jpg and .jpeg files?

Not on this tool. The encoder decodes the file and re-encodes the pixels, so the extension never reaches it — this site ran one photograph as .jpg, .jpeg and .jpg again on the 60 KB page and all three returned 61,310 bytes, identical byte for byte. The same path is what produced every number on this page.

Is my file uploaded?

No. Decode, re-encode and the compliance check all happen in the tab. The 0 ms same-target repeats are possible precisely because there is no round trip — the tool compares against the file it already has.

Where the numbers come from. All figures measured on 4 November 2026 with Chrome 157.0.8103.38 (headless, driven over the DevTools protocol) on Windows 11, using this site's compressor through its published interface, one run per row, each in a fresh tab. Source: a 3000 × 2000 night photograph, 689,299 bytes; first-pass outputs were saved to disk and fed back as the second-pass inputs, so every second pass started from the exact bytes the first pass produced. Output bytes were confirmed three ways on all twelve runs — the tool's report, a FileReader read of the returned blob, and the saved file on disk, all equal; dimensions two ways; the vs-original error through two decode paths that agreed to within 0.036 levels. One photograph is one sample point: a different picture will produce different deltas, though the three-way structure — nothing, then bytes-with-fewer-pixels, then a tenth of a level — is what the mechanism predicts.

Read these alongside: the KB ladder puts six single-pass budgets in one page; 20 KB is the deep end of the target range; 200 KB is where the quality floor stops biting; the PNG size reducer is the lossless alternative — bytes off the file with every pixel identical by hash; WebP is what the same bytes buy in a different format; and the JPEG size reducer splits the first-pass error into Y, Cb and Cr channels across nine budgets.