Skip to content

JPEG to SVG converter

JPG → SVG traces compressed pixels into vector regions, and every JPEG ringing artefact along an edge gets its own small path.

  • Converted with Image engine · input deleted within 24 h
  • Free: 5 conversions a day · 5 MB each
  • Higher limits →

From real runs

What you get — and what changes

  • Large flat shapes Kept

    Mountains, sun and foreground band were traced as recognizable filled paths despite the JPEG block structure underneath them.

  • Edges Changed

    Along the mountain ridges the JPEG halo produced a fringe of small purple and grey paths that are not in the original artwork.

  • Path count Changed

    The 43,177-byte JPEG traced into 354 paths using 333 distinct fills, five times more paths than the lossless PNG of the same picture.

  • File size Changed

    The SVG weighed 127,449 bytes, about three times the JPEG, because each speckle region carries its own coordinates.

  • Caption text Changed

    Letters were traced as outlines with slightly ragged edges where JPEG noise touched the glyphs; they are shapes, not text.

  • Gradient sky Lost

    The sky gradient was quantized into a handful of flat blue bands with visible steps between them.

  • EXIF and colour profile Lost

    Camera tags and ICC data in the JPEG are dropped; the SVG carries only pixel dimensions.

Sample conversions

Illustration saved as JPEG

Input
sample.jpg, 1200×800 baseline JPEG, 43,177 bytes, the same harbour illustration used across the image pages.
Output
127,449-byte SVG, 354 paths, 145 ms. Big shapes were clean; the ridges carried a fringe of artefact paths and the sky became stepped bands.

Same picture from the lossless PNG for comparison

Input
sample.png, identical artwork without JPEG compression.
Output
70 paths and 34,597 bytes: the difference is entirely compression noise being traced as shapes.

A real JPEG → SVG run

We converted our JPEG sample (42 KB) with Image engine on 2026-09-11. It took 145 ms and produced a 124 KB SVG file, 3.0× larger than the input. The engine raised 1 warning, listed below.

Input · sample.jpg · 42 KB

1200 × 800 px, baseline

Width
1,200
Height
800
Encoding
baseline

Output · sample.svg · 124 KB

SVG, 354 paths

Paths
354
  • Pixels traced to 354 vector paths; text in the image is not editable and photographs become flat colour regions.

First lines of the output

svg
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="1200" height="800">
<path d="M0 0 C396 0 792 0 1200 0 C1200 264 1200 528 1200 800 C804 800 408 800 0 800 C0 536 0 272 0 0 Z " fill="#4BA6C9" transform="translate(0,0)"/>
<path d="M0 0 C2.744 1.551 5.265 3.314 7.786 5.203 C11.785 8.07 16.149 10.317 20.451 12.692 C22.42 13.815 24.389 14.939 26.357 16.063 C33.811 20.274 41.378 24.263 48.951 28.255 C59.113 33.613 69.181 39.089 79.15 44.802 C87.326 49.461 95.628 53.865 103.951 58.255 C114.112 63.614 124.181 69.089 134.15 74.802 C143.006 79.848 152.012 84.595 161.026 89.349 C169.928 94.048 178.765 98.834 187.513 103.817 C188.438 104.341 189.362 104.…

Is your file a scan?

JPEG scans of line art trace acceptably in binary mode with filterSpeckle around 8, because the threshold discards most compression noise. For a scan whose words matter, use JPG → TXT or JPG → DOCX with AI Deep Read (1 credit per image) rather than a trace.

Options and when to change them

filterSpeckle
Raise it to 8 or more for JPEGs; it removes most of the small artefact paths that appear along compressed edges.
mode
Use binary for scanned signatures or stamps saved as JPEG; the threshold hides compression noise better than colour tracing.
colorPrecision
Lower it to merge the stepped sky bands and other near-duplicate shades into fewer paths.

Do it yourself

vtracer (Python)

bash
from PIL import Image
import vtracer

img = Image.open("in.jpg").convert("RGBA")
svg = vtracer.convert_pixels_to_svg(list(img.getdata()), img.size, colormode="color", filter_speckle=8)
open("out.svg", "w").write(svg)

A light blur before tracing (ImageFilter.GaussianBlur(1)) removes more ringing than any speckle filter.

JPEG to SVG by API or MCP

The HTTP API and the MCP server run the exact engine this page uses (Image engine); the response carries the same warnings the web converter shows. Check support first with GET /api/v1/pairs?from=jpg&to=svg.

curl
curl -X POST https://filetypeconverters.com/api/v1/convert \
  -H "Authorization: Bearer $FTC_API_KEY" \
  -F "file=@input.jpg" -F "from=jpg" -F "to=svg" \
  -F 'options={"dpi":96}' \
  --output output.svg

Options this engine accepts for JPEG SVG

KeyApplies toTypeDefault
dpiReading JPEGnumber96
widthWriting SVGnumber0
heightWriting SVGnumber0
fitWriting SVGcontain · cover · fillcontain
qualityWriting SVGnumber90
backgroundWriting SVGstring#ffffff
stripMetadataWriting SVGbooleantrue
API reference

When this is the wrong conversion

  • If a PNG or the original vector file exists, trace that instead; JPEG compression is the main source of stray paths.
  • If the JPG is a photo, use JPG → WebP or JPG → AVIF for a smaller file; a photo trace is larger and blockier than the JPEG.
  • If you want the text in the image, JPG → TXT with AI Deep Read reads it; tracing only draws the letter shapes.

JPEG to SVG questions

Why does the JPG trace have so many more paths than a PNG trace?

JPEG stores 8×8 blocks with ringing around sharp edges. The tracer cannot tell that halo from real detail, so it draws each fringe blob as its own path: 354 paths from the JPEG against 70 from the PNG.

Can I reduce the speckle paths?

Yes. Set filterSpeckle to 8 or higher, which drops regions smaller than that many pixels, or blur the JPEG slightly before uploading. Both trade fine detail for cleaner shapes.

Is a traced SVG of a photo smaller than the JPG?

No. The sample SVG was three times the JPEG size, and a real photograph produces far more regions. Tracing is a way to get vector shapes, not a compression method.