DEV Community

Siva
Siva

Posted on • Originally published at Medium on

Converting PNG to SVG in Golang using Potrace and Convert Tool

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
Enter fullscreen mode Exit fullscreen mode

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"
)
Enter fullscreen mode Exit fullscreen mode

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"
   ...
}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

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)
}
Enter fullscreen mode Exit fullscreen mode

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")
}
Enter fullscreen mode Exit fullscreen mode

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")
   }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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

Top comments (0)