ImageToSVG.site Open the converter

Benchmark → Quality & Methodology · ~9 minute read

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):

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:

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

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

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