How we evaluate SVG tracing — a reproducible benchmark
Every converter claims great quality; almost none show their work. This page is the work: ten owned inputs, measured outcomes — failures included — and a public harness that reproduces the table.
Why we publish this
Vendor benchmarks without published methodology are marketing, not measurement: you cannot tell what was tested, at which settings, or what fails. We would rather be auditable than impressive. Below: inputs, metric definitions, and every result — including the failures, marked ⚠. If a number stops matching a fresh harness run, the harness wins and this page gets corrected.
Scope: results generated from the same unmodified engine files the browser loads — the deployed pipeline, not a tuned lab copy.
Method
Inputs. Ten synthetic images we generate ourselves (nothing licensed):
- a two-color 512×512 logo with enclosed holes;
- a flat icon, 10 fills + white = 11 colors (512×512);
- the same icon via a 4× supersample (antialiased edges);
- a smooth 512×512 gradient (262,000+ colors);
- a noisy 1536×1152 photo-like scene (sky ramp, silhouette, disc);
- a 1536×1280 photo-like scene with many different hues (the hard case for any color-matching palette);
- the icon at 64×64, colors merged sub-pixel;
- a transparent-background icon with punched alpha holes;
- black-and-white line art, 1–3 px strokes.
Defaults as measured: the app's own auto settings. Engine: the Potrace algorithm, cubic Bézier curves, one layer per color, holes preserved by the evenodd fill rule. Photo-like sources automatically get extra palette refinement before tracing — the two photo scenes below ran with it; logos, icons and line art run the exact-color path.
Each output SVG is then rasterized and compared against the source at the same size. Metrics, in plain words:
- shapeErr % — how much of the outline disagrees with the source (silhouette fidelity);
- exact % — pixels that come out the exact same color;
- near16 % — "the right color": pixels within a small tolerance of the source (a shade off counts as right);
- MAE — overall color error, lower is better.
Disclosed approximation: the Node harness downsamples slightly differently than the browser — this affects only the photo-at-768 row. Timings: one desktop machine (Node v24); indicative, not absolute.
Results
Every case the harness runs, no cherry-picking. Bytes are exact SVG sizes; ms
is total pipeline time; @-rows are variants of the row above.
| Input | Settings | Paths | Bytes | ms | Exact % | Near ±16 % | MAE | Note |
|---|---|---|---|---|---|---|---|---|
| logo_hole_2color | detail=768 colors=5 simplify=0 | 2 | 2,977 | 417 | 99.87 | 99.87 | 0.26 | 2 flat colors + 2 holes, hard edges |
| icon_flat_10color | detail=768 colors=5 simplify=0 | 5 | 7,190 | 389 | 79.94 | 79.94 | 8.71 | 10 colors but default max=5 → forced merge |
| icon_flat_10color@c12 | detail=768 colors=12 simplify=0 | 11 | 15,594 | 358 | 99.02 | 99.02 | 0.75 | headroom: max above true count |
| icon_antialiased_10color | detail=768 colors=5 simplify=0 | 5 | 8,336 | 347 | 76.39 | 79.87 | 8.65 | same icon with AA edges |
| icon_antialiased_10color@c12 | detail=768 colors=12 simplify=0 | 12 | 18,938 | 321 | 93.59 | 98.25 | 1.04 | AA + headroom |
| ⚠ gradient_smooth | detail=768 colors=5 simplify=0 | 5 | 1,130 | 329 | 0.06 | 70.64 | 9.51 | continuous gradient, default 5 colors |
| ⚠ gradient_smooth@c16 | detail=768 colors=16 simplify=0 | 16 | 3,589 | 924 | 3.39 | 99.93 | 2.79 | gradient with more bands |
| ⚠ photo_like_1536 | detail=768 colors=5 simplify=0 | 5 | 80,671 | 553 | 48.88 | 95.59 | 2.91 | 1536x1152 noisy photo → downsampled to 768 |
| ⚠ photo_like_1536@d1536c8 | detail=1536 colors=8 simplify=0 | 7 | 334,945 | 2246 | 48.86 | 91.87 | 3.84 | no downsample |
| ⚠ photo_multi_1536 | detail=768 colors=5 simplify=0 | 5 | 34,321 | 757 | 0.00 | 35.34 | 16.67 | multi-hue photo-like scene (hard color-matching case) |
| ⚠ photo_multi_1536@d1536c8 | detail=1536 colors=8 simplify=0 | 8 | 77,619 | 2,131 | 0.02 | 44.75 | 11.28 | no downscale |
| ⚠ tiny_64 | detail=768 colors=5 simplify=0 | 5 | 2,966 | 25 | 5.51 | 62.91 | 13.27 | 64px icon, never upscaled |
| transparent_bg | detail=768 colors=5 simplify=0 | 2 | 1,142 | 509 | 100 | 100 | 0 | alpha background + punched holes |
| ⚠ lineart_bw | detail=768 colors=5 simplify=0 | 5 | 152,271 | 476 | 91.18 | 91.18 | 6.85 | 1-3px B/W strokes |
Honest failures, marked ⚠: both gradient rows (banding is architectural),
both photo rows (speckle and banding), the two photo_multi rows
(continuous multi-hue content never has exact-color pixels to match — same
architectural banding, and the refined palette produces its own consolidated
shades rather than copying source pixels, so bit-exact matches sit at ~0 by
design; the "right color" measure is what improves), the 64 px icon, and line
art (smoothing-induced gray banding). Shape error stays under 1 % everywhere.
What the numbers say
- Flat art is the home turf. With a truly flat palette, traced colors are exact and pixels follow — the logo at 99.87 % exact pixels (MAE 0.26), the transparent icon at 100 % exact, MAE 0.
- The color cap decides multicolor art. The flat icon holds 11 colors; default Colors=5 keeps 5 and merges the rest — 79.9 % exact, MAE 8.71. At Colors=12 all 11 survive — 99.0 % exact, MAE 0.75. The quality sat behind the cap; auto detection now presets it.
- Gradients band by design. At defaults the gradient keeps 0.06 % exact pixels (MAE 9.51); at Colors=16 MAE drops to 2.79 and 99.93 % of pixels land within ±16 — but the output is still 16 flat bands, architectural, not a bug.
- The noisy photo is the honest loss: 48.88 % exact, 95.59 % within ±16, MAE 2.91, 203 outlines, 78.8 KB. Detail=1536 with Colors=8 makes it worse — 1,085 outlines, 327.1 KB, MAE 3.84, near16 down to 91.87 % — higher detail traces the noise as speckle.
- The photo refinements earn their keep on multi-hue photos: the same 1536 source came out ~25 % lighter (76.8 KB vs 85.8 KB at the identical settings) with better "right color" agreement (44.79 % vs 43.75 % within ±16) — the palette consolidates near-duplicate shades into fewer, cleaner layers instead of tracing each one separately.
- Two more honest losses. A 64 px source is the worst case (colors already merged sub-pixel): 5.51 % exact, 62.91 % "right color", MAE 13.27. And line art pays for the smoothing step that saves everything else — 1–3 px strokes blur into gray ramps, so the tracer builds four banding layers: 830 outlines, 148.7 KB, 91.18 % exact.
Reproduce it
Every number here is regenerable: the harness ships with the public repository, loads the same unmodified engine files the site serves, replays the same pipeline, and writes the results it got. Identical inputs and settings produce byte-identical SVGs and identical metrics — a re-run is the proof, not this paragraph.
Limitations
- Synthetic, self-owned inputs; no real-world photo dataset yet.
- No human preference scoring; MAE can improve while a result looks worse.
- No competitor numbers: cross-tool comparison is future work, once licensing permits. This page measures our engine only — no invented composite score.
- Single-machine timings; row-to-row comparisons only.
- Slight downscaling difference on one photo row.
- Metrics measure color and shape fidelity, not perceived quality.
FAQ
Why do photos trace badly?
Posterization by design: before any path is fitted, the image is reduced to a small flat palette — five colors by default. The noisy photo keeps 48.88 % exact pixels at defaults and 48.86 % even at detail 1536 with Colors 8 — extra detail traces noise into speckle, not accuracy.
Can I trust these numbers?
The metrics are defined on this page, the inputs are generated by us and shipped with the public repository, and the pipeline is byte-stable — same inputs and settings produce byte-identical results. Rerun it and diff your results against this table.
Which settings should I use?
Flat art: leave everything on auto — the logo hits 99.87 % exact at defaults, the transparent icon 100 %. Photos: Colors 12–16, expect poster art (gradient at Colors=16: 99.93 % within ±16). Tiny sources: upscale or redraw first — 64 px is the worst case at 5.51 % exact.
Related reading
- PNG to SVG converter — the tool these numbers describe
- Logo to SVG — where tracing is near-lossless
- How image tracing actually works — the pipeline, stage by stage
- Potrace — the algorithm this engine implements