ExactSize

Compress image to 100KB: what the dead frame actually costs

When a form caps you at 100KB, the usual instinct is to crop first — cut the sky, the margins, the empty background, so the budget is spent on the content. This page measured whether that instinct pays. Three versions of one photograph — a 24-megapixel landscape, the same picture reduced to 6 megapixels, and a 2.16-megapixel copy — were compressed to 100KB whole, then compressed again with their dead top band cropped out losslessly. The result is not what the instinct predicts: the dead frame cost between 1.6% and 4.0% of the budget, and cropping it away bought the subject at most 2.9% more pixels and not one quality step. What the frame does change is the average: the whole-frame error number understates what happened to the subject by up to 18.5%.

Five numbers before you compress anything to 100KB

  • What 100KB held, by source size. The 24MP landscape came back at 1031 × 1547 — 6.6% of its pixels, at the compressor's 40% quality floor. The 6MP photograph kept 68.5% at 2482 × 1655, same floor. The 2.16MP copy kept every pixel at 68.12% quality. Below roughly two megapixels, 100KB stops cutting pixels and starts cutting quality.
  • The dead frame is nearly free. The landscape's sky band — the top 22.9% of the frame — cost about 4,107 bytes of the 102,207-byte output. The night photograph's 8.0% sky band cost about 2,759 bytes. On the 2.16MP copy the sky's cost was measured directly: 1,631 bytes, 1.6% of the budget.
  • Cropping the dead band bought almost nothing. Subject pixels: +2.9% (landscape), +2.8% (6MP), +0.0% (2.16MP). Quality: unchanged at 40.47% for both large sources, unchanged at 68.12% for the small one. The subject error fell 1.5% on the landscape and 12.6% on the 6MP photograph — and did not move at all on the small copy.
  • The file average hides the subject damage. Whole-frame reconstruction error ran 18.5% below the subject-region error on the landscape (5.576 vs 6.846), 14.9% below on the 6MP photo, 3.2% below on the small copy. The flatter the frame, the bigger the gap.
  • Most uploads are mostly dead frame. Measured by 32×32-pixel tiles: a product photo on a plain backdrop was 80.1% flat, a text screenshot 76.3%, a line chart 69.5%, a vector-style graphic 93.4%. That is why 100KB goes further on those files than the pixel count suggests.

All figures measured on 10 November 2026, Chrome 157.0.8103.38 on Windows 11, driving this site's compressor at a 100KB target. Every compression was run three times; all 18 runs per session returned byte-identical files across three sessions.

How these numbers were taken: one landscape photograph (4000 × 6000, 3,492,678 bytes) and one night photograph (3000 × 2000, 689,299 bytes). The dead top band of each was found by a fixed rule, not by eye: tile the image into 32 × 32-pixel tiles, call a tile dead when its luma standard deviation is below 3, and trim the largest run of consecutive top tile-rows in which at least 99% of tiles are dead. That gave 1,376 rows for the landscape (22.9% of the frame) and 160 rows for the night photo (8.0%). The crops were cut with Pillow as pure pixel copies and saved as PNG, so no encoder touched the pixels between crop and compressor; a 1800 × 1200 copy of the night photo (Lanczos, saved once as PNG) and its 96-row crop were added as the small source. Each file was fed to the compressor at a 100KB target, three times, in fresh tabs; every run's byte count was read two ways (the tool's own report and a FileReader pass over the result blob) and every output was decoded two ways (createImageBitmap and an Image element) before comparison. The subject-reconstruction error is the mean absolute per-channel difference (0–255 scale) between the output, upscaled back to the subject's native size, and the original pixels of that same region — the same region for both the whole-frame and cropped outputs. Byte counts and quality values are the compressor's own; times are reported both as the tool's verdict time and an independent wall-clock reading.

What 100KB bought each source, whole frame

Three sources, one target, three runs each. The kept column is the share of the source's pixels that survived. Both large sources landed on the compressor's 40% quality floor — the point at which it stops spending quality and starts cutting dimensions instead. The small source cleared the floor entirely, so 100KB bought it every pixel and a quality search that settled at 68.12%.

Source fed whole Source bytes Output bytes Output px Kept Quality Tool ms ×3
Landscape 4000 × 6000 (24.0 MP) 3,492,678 102,207 1031 × 1547 6.6% 40.47% 9900 / 3595 / 2647
Night photo 3000 × 2000 (6.0 MP) 689,299 102,087 2482 × 1655 68.5% 40.47% 2848 / 3246 / 3277
Same photo at 1800 × 1200 (2.16 MP) 2,187,871 102,086 1800 × 1200 100% 68.12% 447 / 376 / 411

Measured 10 November 2026, Chrome 157.0.8103.38, Windows 11, target 100KB, format JPG, three runs per row. Output bytes were identical across all three runs of every row and matched earlier sessions of this site byte for byte where the same file and target had been run before. Times are the tool's own verdict times for each of the three runs; the independent wall clock read 10125/3800/2858, 3113/3430/3348 and 657/477/472 ms on the same rows. Time is an environment value, not a property of the file.

The 24-megapixel landscape is the case most people picture when a form says 100KB, and the answer is brutal: 1031 × 1547, 6.6% of the pixels, everything at the floor. The same picture at 6 megapixels keeps 68.5%. At 2.16 megapixels nothing is cut at all and the quality search pays instead. Which row you are in is decided almost entirely by how many pixels you hand the compressor.

The same budget with the dead band cropped away

Each source was compressed twice: whole, and again with its dead top band removed by the rule above. The subject is whatever remains — the frame minus the sky. The subject-error column is the mean absolute per-channel difference between the output, upscaled back to the subject's original pixel size, and the original pixels of that region. Both outputs are scored against the identical reference region, so the two rows of each pair are directly comparable.

Version Dead band removed Output bytes Output px Subject px Subject error Whole-frame error
Landscape, whole frame — 102,207 1031 × 1547 1,228,952 6.846 5.576
Landscape, cropped 1376 rows (22.9%) 100,947 1046 × 1209 1,264,614 6.740 —
Night photo, whole frame — 102,087 2482 × 1655 3,777,604 2.304 1.961
Night photo, cropped 160 rows (8.0%) 102,078 2516 × 1543 3,882,188 2.014 —
2.16 MP copy, whole frame — 102,086 1800 × 1200 1,987,200 1.734 1.680
2.16 MP copy, cropped 96 rows (8.0%) 100,455 1800 × 1104 1,987,200 1.734 —

Subject pixels for the whole-frame rows are the subject region as it appears inside the output (the output's scale factor times the subject's source area); for the cropped rows, the whole output is the subject. Whole-frame error is not computed for the cropped rows because those outputs contain no sky to compare against it. Subject error is identical whether the output is decoded with createImageBitmap or with an Image element — both paths agreed to four decimal places on every row.

Read the two large pairs first. The cropped landscape returned 1046 × 1209 against the whole frame's subject coverage of 1031 × 1192 — a subject-pixel gain of 2.9% (35,662 ÷ 1,228,952), with the subject error down 1.5% (6.846 → 6.740). The cropped night photo gained 2.8% subject pixels (104,584 ÷ 3,777,604) and its subject error fell 12.6% (2.304 → 2.014). Both large pairs sit at the same 40.47% floor. Then the small pair, which is the cleanest experiment of the three: identical subject pixels, identical subject error to four decimal places, identical 68.12% quality — the only difference is 1,631 bytes of output size.

So the instinct partially holds once, on one source, and fails twice. Nothing on this page suggests cropping the sky off will rescue a 100KB upload. What it changes is measured in the next section, and it is small.

What the sky actually cost

The small pair gives the sky's price directly: both outputs carry the identical subject at the identical quality, so the byte difference between them is the sky band's cost and nothing else — 102,086 − 100,455 = 1,631 bytes, or 1.6% of the budget, for the top 8.0% of the frame.

The two large pairs give an arithmetic estimate instead, because their cropped outputs carry the subject at a slightly different pixel count. Taking the cropped output's bytes-per-subject-pixel as the price of subject content: the landscape's sky cost about 102,207 − (100,947 ÷ 1,264,614 × 1,228,952) ≈ 4,107 bytes, 4.0% of the budget, for the top 22.9% of the frame. The night photo's sky cost about 102,087 − (102,078 ÷ 3,882,188 × 3,777,604) ≈ 2,759 bytes, 2.7% of the budget. These two are arithmetic on measured values, not separate measurements; the small pair's 1,631 bytes is the only direct reading.

That is the whole finding. A fifth of the landscape's frame cost a twenty-fifth of its budget. The compressor — any DCT-based JPEG encoder — spends its bytes where the detail is, and a smooth sky is nearly free. Which cuts the other way too: the cropped landscape cost 0.0798 bytes per output pixel against the whole frame's 0.0641, because removing the cheap pixels concentrates the expensive ones. The subject got 24.6% more bytes per pixel after cropping (0.0798 ÷ 0.0641) and turned that into 2.9% more pixels at the same floor quality — the encoder had already paid the sky what the sky was worth, which was almost nothing.

The average hides the damage

The whole-frame error column in the comparison table is consistently, and sometimes dramatically, lower than the subject column on the same file. On the landscape: 5.576 whole frame against 6.846 on the subject — the file average understates the damage to the content by 18.5% ((6.846 − 5.576) ÷ 6.846). On the night photo: 1.961 against 2.304, a 14.9% understatement. On the small copy, whose dead band is only 8% of the frame: 1.680 against 1.734, a 3.2% understatement.

The mechanism is the one measured tile-by-tile on the spatial-distribution page: compression damage concentrates where the texture is. A frame that is one-third smooth sky will always produce a flattering average, because the sky reconstructs nearly perfectly. The practical rule this page adds is simple: judge a 100KB result on a 100% zoom of the subject, not on the thumbnail and not on any whole-image quality score — including the ones on this site.

What actually decides a 100KB result

  1. Source pixel count, first. The three sources here span 24.0 → 6.0 → 2.16 megapixels, and the outcomes span 6.6% kept → 68.5% kept → everything kept at 68.12% quality. If your file is large, no amount of frame-trimming changes which regime you are in.
  2. Content density, second. At the same 40.47% floor, the landscape cost 0.0641 bytes per pixel and the night photo 0.0249 — 2.6× apart (0.0641 ÷ 0.0249). Dense content keeps fewer pixels at the same target, whatever its size.
  3. The 40% floor, third. Both large sources hit it, which is why their quality columns are identical despite very different content. Below the floor the compressor cuts dimensions instead — the floor behaviour is documented across this site's other measured pages.
  4. Dead frame, a distant fourth. Between 1.6% and 4.0% of the budget on the three sources measured here. Cropping it away is worth doing for the file it produces — the small cropped copy came back 1,631 bytes lighter for the identical picture — but it will not buy a better-looking subject at 100KB.

Questions this page gets

Should I crop the sky off before compressing to 100KB?

Only if you want the smaller file. Measured: the sky bands here cost 1.6–4.0% of the budget, cropping bought +2.9% / +2.8% / 0% subject pixels, and no quality step anywhere. The one unambiguous win was file size: the cropped 2.16MP copy returned the identical subject, at the identical quality, 1,631 bytes lighter.

What quality will 100KB give my photo?

If your photo is above roughly two megapixels, expect the compressor's 40% quality floor and a dimension cut — 6.6% of pixels kept at 24 MP, 68.5% at 6 MP on this page's photograph. Below about two megapixels, expect every pixel kept and a quality number in the high sixties — 68.12% here. The boundary sits where the whole frame at 40% quality first fits inside 102,400 bytes.

Why does my compressed photo look fine small but fall apart when I zoom in?

Because the smooth parts of the frame survive almost perfectly and the detailed parts take the damage, and at fit-to-screen size the smooth parts dominate what you see. The whole-frame error on this page ran up to 18.5% below the subject-region error. Zoom to 100% on the subject before you submit anything to a form.

Is my screenshot mostly empty space?

Very likely, and that is good news for a 100KB target. Measured flat-tile shares: a text screenshot was 76.3% flat, a product photograph 80.1%, a line chart 69.5%, a vector-style graphic 93.4%. The compressor spends almost nothing on those regions, which is why screenshots and charts compress to tight targets far better than photographs of the same pixel dimensions.

Does the dead frame change the pixel dimensions I get back?

Barely. The cropped landscape returned 1046 × 1209 for its 4000 × 4624 subject; the whole-frame version covered the same subject with 1031 × 1192 of its output. The cropped night photo covered its subject with 2516 × 1543 against 2482 × 1522. Both gains are under 3%, because at the quality floor the byte budget follows the detail, and the detail did not change when the sky left.

Was the test fair to cropping?

The crops were pixel-exact copies (Pillow, saved as PNG — no encoder between crop and compressor), the comparison scored both outputs against the identical subject region at its native size, and every run was repeated three times with byte-identical results. The one thing this page does not claim: that these three sources cover every kind of upload. They are three sample points on one photograph and one landscape; a noisier sky or a busier frame will move the sky's price, though probably not by much — the direct reading on the cheapest case was 1.6% of the budget.

The form-requirement side of this same target — which official photo specs actually say 100KB, why 100KB here means 102,400 bytes and what to aim at when a form means 100,000 — is measured on the compress JPG to 100KB page. Whether a PNG can reach a tight byte target at all is on the PNG at 100KB page. The same photograph at five other budgets, 20KB through 1MB, is on the six-tier ladder page; the 200KB tier's quality numbers are on the 200KB page.

Where the damage lands inside the frame, tile by tile, and why texture predicts it (Spearman ρ 0.96–0.98 on one photograph), is measured on the spatial-distribution page. How long the compressor takes at each target — including why ~100KB is the slowest one — is on the compression-time page.

This page compares a whole frame with a crop to measure what a dead band costs. A different 100KB test uses seven uncropped inputs to measure returned dimensions and aspect-ratio drift for the resize intent: resize image to 100KB. Its measurements are independent of the crop comparison above.

The separate compress image for email test measures whether GPS, capture time, camera identity and orientation survive a JPG re-encode. It uses a synthetic metadata fixture and two EXIF readers; this page's crop and subject-error experiment is not part of that test.

A different controlled 100KB experiment applies synthetic RGB perturbations to one photograph before compression: compress photo to 100KB with synthetic noise. It reports PNG input bytes, JPG output error and timings; it does not claim to model camera sensor grain or reuse this page's dead-frame comparison.