Measured, never asserted. Including the row we lose.
The figures below were produced by npm run compare in the
Vecline library repo.
Each tool’s SVG is rendered back to pixels with the same renderer and scored with the
same metrics, on the same ground — so nothing on this page depends on Vecline’s own view of
quality. The harness was written to be able to embarrass us, and on one axis it does.
The corpus is public Kodak photographs at 480 px plus synthetic fixtures generated inside the script itself, so the whole thing reproduces without licensing anyone’s images. The engine is MIT: clone it, run the script, and check every claim on this page against your own output.
Higher PSNR and SSIM are better; lower ΔE₀₀ is better.
∞ PSNR with 1.0000 SSIM and 0.000 ΔE₀₀ is not a rounding artefact — it means the vector re-rasterises bit-exact against the source. SSIM is structural similarity (1.0000 is identical), PSNR is peak signal-to-noise in decibels, and ΔE₀₀ is mean perceptual colour difference (0.000 is no difference at all).
potrace traces black and white. Its colour rows below use posterize, a bolt-on multi-level mode that is not what the tool was built for. Reporting those numbers without saying so would be a rigged fight, so it is said here, in the same size type as the results.
The bilevel row is apples to apples: that is the case potrace was designed for, and it is measured against Vecline directly.
On line art and flat colour art, Vecline’s lossless mode returns provably bit-exact
vector geometry — real paths and fills, not an embedded bitmap smuggled inside an SVG
wrapper. The ∞ / 1.0000 / 0.000 rows are the measurement of exactly that.
It is worth being clear about what this is: a category the other tools do not offer at all, not a margin of victory on a shared axis.
| Tool | Size | PSNR | SSIM | Mean ΔE₀₀ |
|---|---|---|---|---|
| Bilevel line art the case potrace was built for | ||||
| potrace | 1.5 KB | 24.67 dB | 0.9511 | 0.702 |
| imagetracerjs | 1.7 KB | 19.75 dB | 0.8607 | 1.667 |
| Veclinebit-exact | 1.4 KB (best) | ∞ (best) | 1.0000 (best) | 0.000 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
| Flat colour art potrace row uses posterize | ||||
| potrace posterize | 1.9 KB | 14.61 dB | 0.8010 | 21.302 |
| imagetracerjs | 1.6 KB (best) | 26.56 dB | 0.9363 | 0.662 |
| Veclinebit-exact | 1.8 KB | ∞ (best) | 1.0000 (best) | 0.000 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
| Photo synthetic · gradient plus noise | ||||
| potrace posterize | 11.5 KB (best) | 13.19 dB | 0.6024 | 23.911 |
| imagetracerjs | 11.8 KB | 26.85 dB | 0.7143 | 5.623 |
| Vecline | 19.0 KB | 31.12 dB (best) | 0.7750 (best) | 2.940 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
Magenta, underlined = best in that column for that fixture. ∞ = bit-exact re-rasterisation.
| Tool | Size | PSNR | SSIM | Mean ΔE₀₀ |
|---|---|---|---|---|
| Portrait skin, soft transitions | ||||
| potrace posterize | 729.4 KB (best) | 18.51 dB | 0.6897 | 18.030 |
| imagetracerjs | 1620.5 KB | 25.47 dB | 0.7093 | 5.957 |
| Vecline | 1337.9 KB | 34.80 dB (best) | 0.9140 (best) | 2.663 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
| Lighthouse large smooth sky | ||||
| potrace posterize | 860.0 KB (best) | 20.76 dB | 0.7671 | 10.909 |
| imagetracerjs | 2010.2 KB | 24.58 dB | 0.7465 | 4.900 |
| Vecline | 1742.7 KB | 36.26 dB (best) | 0.9453 (best) | 2.575 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
| Parrots fine detail, saturated colour | ||||
| potrace posterize | 197.1 KB (best) | 17.09 dB | 0.7152 | 17.566 |
| imagetracerjs | 300.8 KB | 25.81 dB | 0.7615 | 6.317 |
| Vecline | 309.5 KB | 31.18 dB (best) | 0.8460 (best) | 3.686 (best) |
| Vectorizer.AI | not measured — paid cloud service, cannot be run in this harness | |||
Smaller is not the same as better. potrace posterize wins the size column on every photograph, and it wins it by discarding colour — the same rows carry the worst PSNR, SSIM and ΔE₀₀ in the table (ΔE₀₀ of 10.9 to 23.9 is a difference you can see without measuring). Size is only meaningful read alongside the three fidelity columns, which is why all four are printed together and none of them is printed alone.
The library’s own README carries a wider version of this table that also measures vtracer, the strongest open-source colour tracer, which leads Vecline on the synthetic-photo fixture. It is linked, not hidden: see the full comparison.
Vectorizer.AI is paid, cloud-hosted and closed source. Twelve axes, and it takes one of them.
It runs proprietary neural networks that infer the shapes a human meant to draw — separating an object from a busy background, closing a line a scanner broke, guessing intent where the pixels are ambiguous. Vecline does none of that. It is deterministic and classical: quantise, contour, fit curves, measure. On a difficult photograph or dense illustration, inference is a real advantage, and we are not going to pretend otherwise.
We took that trade knowingly. A model that infers is a model that can be silently retrained, so the same file put through it next year can come back different. Determinism means the same input gives the same output forever — auditable, diffable, safe to put in a build pipeline. It also means the engine can run entirely on your machine, with no upload, no account and no dependency on a company continuing to exist. Every measured row above is a consequence of the same choice, and so is this one.
A comparison page that wins every row is not a comparison, it is an advertisement. This is the row we lose; it is why the other eleven are worth reading.
| Axis | Vecline | Vectorizer.AI | Better |
|---|---|---|---|
| Tracing quality on hard photographic and complex art | Deterministic and classical — no shape inference | Proprietary neural networks that infer intended shapes | Vectorizer.AI |
| Price | Free and unlimited | Paid, per image | Vecline |
| Privacy | Converts in your browser — the image is never uploaded | Image is uploaded to the cloud | Vecline |
| Offline | Works fully offline | Requires a connection | Vecline |
| Account | None | Required | Vecline |
| Openness | Engine is MIT open source | Closed | Vecline |
| Reproducibility | Deterministic — same input, same output, forever | Silently versioned model | Vecline |
| Measured quality | SSIM, PSNR and ΔE₀₀ reported for every conversion | None reported | Vecline |
| Provable lossless mode | Yes — bit-exact vector geometry on flat art | None | Vecline |
| Maker output | Centerline, G-code and DXF for laser, CNC and plotter | No G-code, no centerline | Vecline |
| Documents | PDF and Office → images or vector, in the same tool | None | Vecline |
| Automation | CLI, npm library, MCP server for AI agents, GitHub Action, Vite plugin | REST API | Vecline |
Every row above describes what each tool offers, not how well it scores — because Vectorizer.AI’s quality was not measured here. It is paid and cloud-only, so it could not go through the same harness as potrace, imagetracerjs and Vecline. That is why the quality row says “likely better” and carries no number: an honest likely beats a fabricated decimal.
Nothing on this page asks for trust. The engine is MIT licensed, the harness is
scripts/compare.mjs in the repo, the corpus is public, and
npm run compare regenerates every figure above on your own machine. If a number here
does not survive that, it is a bug in the page and we want to know.
And the studio does the same thing per conversion: SSIM, PSNR and ΔE₀₀ on every single output, measured against your source, in your browser, with the file never leaving your device.