How to batch convert bitmaps to SVGs?

Unix & Linux Asked by Village on December 10, 2020

I have many gray scale bitmaps that I need to convert to a vector format, such as SVG. I have been using Inkscape, which gives nice results, but this takes about 10-15 minutes to open, convert, and save a file. Is there a batch or command line tool that can convert these?

5 Answers

Here is a wiki comparsion of all Bitmap-to-SVG tools. I recommend two tools based on my own testing. Both of them can convert bitmaps to SVGs in a batch manner.

  1. imagetracerjs is a free js/java tool, which can vertorize the bitmaps while keeping colors.

  2. vectormagic is a commercial tool and it outperforms other tools in my testing.

vectormagic imagetracer photepea vertorizer

Answered by Lei Yang on December 10, 2020

potrace is the tool for that. You can process them bulk, but first you have to convert the images to monochrome:

ls ./*.jpg | xargs -L1 -I {}  convert -monochrome {} {}.ppm
ls -1 ./*.ppm | xargs -L1 -I {} potrace {} -r 300 -b svg -o {}.svg

Install on Ubuntu:

sudo apt install potrace

If you want to convert images that are not monochrome, Inkscape has a tracer tool base on potrace that support multiple colors, it first converts the image to color layers and then it trace those and combines the result.

To use the tracer, load or import an image, select it, and select the Path > Trace Bitmap item, or Shift+Alt+B.


Tutorial here!

Answered by Eduard Florinescu on December 10, 2020

Normally, I do all my image manipulation tasks with convert from ImageMagic but I can't get it to play nice with svg files. You can, however, use inkscape itself from the command line:

for i in *bmp; do inkscape -f "$i" -l "$i.svg"; done

That will create files called foo.bmp.svg. To get the names right, try this:

for i in *bmp; do inkscape -f "$i" -l "${i%.bmp}.svg"; done

The problem with this approach is that, at least on my system, it pops up an annoying graphical dialog asking if I want to link or embed the image:

                                 enter image description here

So, you still need to click OK manually, but it is still much much faster than doing it file by file.

The output images are identical as far as I can tell:

   enter image description here

Theoretically, both convert and rsvg-convert should be able to do this but I couldn't get it to work well on my images in the few minutes I spent trying. They're both worth looking into nevertheless.

Answered by terdon on December 10, 2020


You could try autotrace.

Using the following command you get the following results:

autotrace --output-format svg --output-file output.svg --color-count 4 imgsrc.jpg

I had to take a screencapture of the resulting svg and save as png to show the output.

Here is a source image jpg:

skull source

Here is the resulting image:

skull convert

Answered by rking on December 10, 2020


I found this example on SO in a Q&A titled: How to convert a JPEG image into SVG format using ImageMagick?. One of the answers suggested potrace.

$ convert input.jpg output.ppm
$ potrace -s output.ppm -o svgout.svg


           ss #1             ss #2

Looking at the potrace website you can apparently go directly from BMP to SVG.

$ potrace -s input.bmp -o output.svg


Another option to potrace is autotrace.

$ autotrace -output-file ouput.svg -output-format svg --color-count 4 input.bmp

You'll likely have to play with the --color-count to get an image that suites your needs.


                                                 ss #3

Which to use?

Of these 2 it really depends on the source material. If you're converting images then potrace is likely the better option. For non-photo material such as fonts and inanimate objects such as scenery that includes things like roads, then autotrace with its --centerline switch.

While not optimal for photos, it does good job on line art and poster-like images. Doesn't do too well with color. Autotrace has some features not available in the embedded Potrace dialog in Inkscape. For example, there is a centerline switch that is especially usefull for tracing roads (in maps) or font characters.

Batch conversions

You can wrap either of these commands in a for loop in Bash, which will make easy work of doing bulk conversion tasks.

$ for i in *.bmp; do <CONVERSION TOOL> ... "$i"; done


Answered by slm on December 10, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP