Raster → vector (SVG) for Node, a WebAssembly build of
vtracer. Image decoding and
vectorization both happen in wasm, so there is no native dependency — just
npm install.
visioncortex VTracer is an open source software to convert raster images (like jpg & png) into vector graphics (svg). It can vectorize graphics and photographs and trace the curves to output compact vector files.
Comparing to Potrace, VTracer has an image processing pipeline which can handle colored images. VTracer skips Potrace's expensive optimal-polygon search in favor of a fast, linear pipeline that stays faithful to high-resolution images.
Comparing to Adobe Illustrator's Image Trace, VTracer's output is much more compact as we adopt a stacking strategy and avoid producing shapes with holes.
VTracer is originally designed for processing high resolution scans of historic blueprints up to gigapixels. At the same time, VTracer can also handle low resolution pixel art, simulating image-rendering: pixelated for retro game artworks.
Technical descriptions of the tracing algorithm and clustering algorithm.
npm install @visioncortex/vtracerconst fs = require('fs');
const vtracer = require('@visioncortex/vtracer');
// file in, file out
await vtracer.convertFile('in.png', 'out.svg');
await vtracer.convertFile('in.jpg', 'out.svg', { mode: 'polygon', hierarchical: 'cutout' });
// buffers
const svg = vtracer.convertBuffer(fs.readFileSync('in.png'), { preset: 'poster' });
// raw RGBA8 pixels
const svg2 = vtracer.convertPixels(rgba, width, height, { clustering: 'bw' });convertBuffer(buffer, options?) => string— encoded image (PNG/JPEG/GIF/BMP) → SVG.convertPixels(rgba, width, height, options?) => string— raw RGBA8 → SVG.convertFile(input, output, options?) => Promise<void>— read, trace, write.convertFileSync(input, output, options?) => void.
preset ("bw" | "poster" | "photo", applied first), clustering
("color-cluster" | "bw" | "watershed"), hierarchical ("stacked" | "cutout"
for the seam-free mosaic), mode ("pixel" | "polygon" | "spline"),
filterSpeckle, colorPrecision, layerDifference, cornerThreshold,
lengthThreshold, maxIterations, spliceThreshold, simplify (curve
simplification tolerance in px, try 1–2.5), pathPrecision, palette (list of
#rrggbb), maxColors, optimize (0 | 1 | 2), binaryThreshold /
adaptive / adaptiveWindow / adaptiveT (binary mode), watershedDetail
(default 128; higher = more regions, uncapped).
Requires the Rust toolchain and wasm-pack:
npm run build # wasm-pack build --target nodejs --out-dir pkg
npm test