Converting PNG to SVG in Golang using Potrace and Convert Tool
Tags: png, linux, go, svg
Published: 2023-04-29 05:10:20

---
title: Converting PNG to SVG in Golang using Potrace and Convert Tool
published: true
date: 2023-04-16 13:31:20 UTC
tags: png,linux,golang,svg
canonical_url: 
---

Converting a PNG image to an SVG file using Potrace is a common task in image processing. Potrace is a free and open-source tool for converting bitmap images to vector graphics. In this blog, we will see how to use Convert and Potrace to convert a PNG file to SVG format in Golang.

Prerequisites:

- Golang installed on your system
- Potrace installed on your system
- ImageMagick installed on your system

```
sudo apt-get install potrace imagemagick
```

**Step 1:** Import Required Packages First, we need to import the necessary packages for our program. We will use the os/exec package to execute the Potrace command in our program.

```
package main

import (
    "os"
    "os/exec"
)
```

**Step 2:** Define Input and Output Paths Next, we need to define the input PNG file path and the output SVG file path. In this example, we will use the file paths "input.png" and "output.svg", respectively.

```
func main() {
   // Input and output file paths
   pngPath := "./input.png"
   bmpPath := "./input.bmp"
   svgPath := "./output.svg"
   ...
}
```

**Step 3:** Execute Potrace Command Now, we can execute the Potrace command using the os/exec package. We need to create a new exec.Cmd variable and pass the Potrace command and arguments as its arguments. In this example, we will use the following command to convert the PNG file to BMP, and BMP to SVG:

```
cmdBmp := exec.Command("convert", pngPath, bmpPath)
cmd := exec.Command("potrace", "-s", bmpPath, "-o", svgPath)
```

The -s flag is used to suppress the output of statistics, -o flag is used to specify the output file path, and the input PNG file path is passed as an argument.

We can then use the Run() method of the cmd variable to execute the Potrace command. This method will block until the command has completed.

```
err := cmd.Run()
if err != nil {
    panic(err)
}
```

Step 4: Check Output File Finally, we need to check if the output SVG file exists. We can use the os.Stat() function to check the file's existence. If the file does not exist, we can panic and print an error message.

```
if _, err := os.Stat(svgPath); os.IsNotExist(err) {
    panic("Output file does not exist")
}
```

**Here’s the complete code:**

```
package main

import (
 "os"
 "os/exec"
)

func main() {
 // Input and output file paths
   pngPath := "./input.png"
   bmpPath := "./input.bmp"
   svgPath := "./output.svg"
  
   // Convert PNG to BMP
   cmdBmp := exec.Command("convert", pngPath, bmpPath)
   errBmp := cmdBmp.Run()
   if errBmp != nil {
      panic(errBmp)
   }
   // defer os.Remove(bmpPath)
  
   // Convert BMP to SVG using Potrace
   cmdSvg := exec.Command("potrace", "-s", bmpPath, "-o", svgPath)
   errSvg := cmdSvg.Run()
   if errSvg != nil {
      panic(errSvg)
   }
  
   // Check if the output file exists
   if _, err := os.Stat(svgPath); os.IsNotExist(err) {
      panic("Output file does not exist")
   }
}
```

To run the program, save the above code in a file named main.go and run the following command in the terminal:

```
go run main.go
```

This will convert the PNG file "input.png" to SVG format and save it as "output.svg". You can change the input and output file paths to suit your requirements.

In conclusion, Potrace is a useful tool for converting bitmap images to vector graphics. By using Potrace in Golang, we can automate the process of converting PNG files to SVG format.

### Demo — Code Walkthrough

{% gist https://gist.github.com/byteshiva/e99ab1a41e4a336a704d6400be78e7d9 %}