Files
vtracer/crates/vtracer-py/README.md
T
Chris Tsang 74da0efb84 Uncap watershed detail in the Node binding + sync docs
`6f163fc` widened watershed_detail from u8 to u32 in the core, CLI, and
Python binding but not the Node/wasm binding, which still assigned a u8 to
config.watershed_detail — a wasm build error (E0308). Widen the Node
Options field to u32 and refresh every "0..=255" watershed doc (CLI help,
Config field, .pyi, index.d.ts, and all three READMEs) to reflect that the
level is now uncapped (default 128; higher = more regions).
2026-08-08 21:50:55 +01:00

4.1 KiB
Raw Blame History

VTracer

Raster to Vector Graphics Converter

Web App | Windows App

vtracer (Python)

Python bindings for vtracer. Built with pyo3 + maturin; the core Rust crate stays pure (no I/O), and this crate adds image decoding and a Pythonic API.

Introduction

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.

Install

pip install vtracer==1.0.0a3

Usage

import vtracer

# one-liners
vtracer.convert_file("in.png", "out.svg")
svg = vtracer.convert_bytes(open("in.png", "rb").read())          # -> str
svg = vtracer.convert_pixels(rgba_bytes, width, height)           # raw RGBA8

# a rich, reusable configuration object
cfg = vtracer.Config(mode="polygon", filter_speckle=8)
cfg.hierarchical = "cutout"          # seam-free mosaic
cfg.palette = ["#1b1b1b", "#e0c088", "#5a7d3c"]   # snap to a fixed palette
cfg.max_colors = 8                   # or auto-quantize
cfg.optimize = 2
svg = cfg.convert_bytes(data)

# presets
vtracer.Config.poster().convert_file("photo.jpg", "poster.svg")
vtracer.Config.bw().convert_file("scan.png", "lineart.svg")

Config

Constructor keyword arguments (all optional) — also exposed as mutable properties, plus the presets Config.bw(), Config.poster(), Config.photo():

arg default notes
clustering "color-cluster" "color-cluster", "bw", or "watershed"
hierarchical "stacked" "stacked" or "cutout" (mosaic)
mode "spline" "pixel", "polygon", "spline"
filter_speckle 4 discard patches smaller than X px
color_precision 6 significant bits per channel
layer_difference 16 color diff between gradient layers
corner_threshold 60 degrees
length_threshold 4.0 px
max_iterations 10
splice_threshold 45 degrees
simplify None curve simplification tolerance in px (try 12.5)
path_precision 2 output decimal places
palette None list of #rrggbb strings
max_colors None auto-quantize target
optimize 1 0 off, 1 quantize+cleanup, 2 + shorthands
binary_threshold 128 bw: fixed cutoff, foreground below it
adaptive False bw: BradleyRoth adaptive thresholding
adaptive_window 0 bw adaptive: window px (0 = auto)
adaptive_t 15.0 bw adaptive: % below local mean
watershed_detail 128 watershed: hierarchy cut level (higher = more regions, uncapped)

Each Config has convert_file(input, output), convert_bytes(data, format=None) -> str, and convert_pixels(rgba, width, height) -> str.

Build from source

maturin develop            # into the active virtualenv
maturin build --release    # produce a wheel