Menu

How to Generate Barcode in Golang?

Scan or generate QR code with Go language

In this tutorial, we will create a program in Golang which can read an image file as input and write the text to standard output.

What exactly is QR code?

QR code or Quick Response code is a type of matrix or two dimensional (2D) barcode developed in 1994 that can be read easily by a digital machine/device, such as a cell phone, and which stores information as a series of pixels in a square-shaped grid.

Follow these steps to write a program which could read and generate QR code purely with Go language:

Make sure you have installed Golang and properly set up the environment variable. Check out Golang installation tutorial here.

1. Start by creating a file **main.go** and import the required Golang packages:

  • fmt - To print extracted html comments.
  • os - To read HTML files from standard input (stdin)
  • image - Read an image file.
  • io/ioutil - impliments package input output utility functions.
  • bytes - manipulation of byte slices
  • image/png - write encoded QR code to a PNG image binary file.
  • github.com/boombuler/barcode - a barcode creation library. (here used to scale the code.)
  • github.com/boombuler/barcode/qr - a qr code creation library
  • github.com/liyue201/goqr - QR Code recognition and decoding
package main

import (
    "image/png"
    "os"
    "image"
    "io/ioutil"
    "bytes"
    "fmt"

    // github. com liyue201 GOQR
    "github.com/liyue201/goqr"
    // barcode scale 
    "github.com/boombuler/barcode"
    // Build the QRcode for the text
    "github.com/boombuler/barcode/qr"
)

2. Generate QR code from text with Go language

Import required packages.

import (
    "image/png"
    "os"
    
    // barcode scale 
    "github.com/boombuler/barcode"
    // Build the QRcode for the text
    "github.com/boombuler/barcode/qr"
)

Let's create a function which generates QR code for given string and write it to a image file.

func qrCodeGen(t string, filename string) (error) {}

Use qr.Encode() function to encode given text into a QR code.

func qrCodeGen(t string, filename string) (error) {

    // Create the barcode
    qrCode, _ := qr.Encode(t, qr.M, qr.Auto)

}

Scale the QR code to the 200*200 pixels with barcode.Scale() function.

func qrCodeGen(t string, filename string) (error) {

    // Create the barcode
    qrCode, _ := qr.Encode(t, qr.M, qr.Auto)

    // Scale the barcode to 200x200 pixels
    qrCode, _ = barcode.Scale(qrCode, 2000, 2000)


}

Create a file to write QR code to it with os.Create() function.

func qrCodeGen(t string, filename string) (error) {

    // Create the barcode
    qrCode, _ := qr.Encode(t, qr.M, qr.Auto)

    // Scale the barcode to 200x200 pixels
    qrCode, _ = barcode.Scale(qrCode, 2000, 2000)

    // create the output file
    file, err := os.Create(filename)
    defer file.Close()

}

Write the encoded image into a PNG image file with png.Encode() function.

func qrCodeGen(t string, filename string) (error) {
    // Create the barcode
    qrCode, _ := qr.Encode(t, qr.M, qr.Auto)

    // Scale the barcode to 200x200 pixels
    qrCode, _ = barcode.Scale(qrCode, 2000, 2000)

    // create the output file
    file, err := os.Create(filename)
    defer file.Close()

    // encode the barcode as png
    png.Encode(file, qrCode)

    return err
}

Finally call the function in your code to Generate the QR code.

package main

import (
    "image/png"
    "os"
    
    // barcode scale 
    "github.com/boombuler/barcode"
    // Build the QRcode for the text
    "github.com/boombuler/barcode/qr"
)


func qrCodeGen(t string, filename string) (error) {
    // Create the barcode
    qrCode, _ := qr.Encode(t, qr.M, qr.Auto)

    // Scale the barcode to 200x200 pixels
    qrCode, _ = barcode.Scale(qrCode, 2000, 2000)

    // create the output file
    file, err := os.Create(filename)
    defer file.Close()

    // encode the barcode as png
    png.Encode(file, qrCode)

    return err
}

func main() {
    
    // This is a text to encode
    t := "This is a text"
    // file to read from 
    filenameR := "qrcode.png"
    // qrCodeGen generates a QR Code
    qrCodeGen(t, filenameR)


}

3. Scan QR code - Go language

Import required packages.

package main

import (
    "image"
    "io/ioutil"
    "bytes"
    "fmt"

    // github. com liyue201 GOQR
    "github.com/liyue201/goqr"
)

Let's create a function to scan provided file, as a path, for QR code and extract text out of it.

func scanQRCode(path string) {}

Read the provided file (path) with ioutil.ReadFile() function.

func scanQRCode(path string) {
    
    // Reads imgdata from a file.
    imgdata, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }

}

Try to decode the file as image:

func scanQRCode(path string) {
    
    // Reads imgdata from a file.
    imgdata, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }

    // Decodes an image.
    img, _, err := image.Decode(bytes.NewReader(imgdata))
    if err != nil {
        fmt.Printf("image.Decode error: %v\n", err)
        return
    }

}

Check if any QR code exist in the provided image.

func scanQRCode(path string) {
    
    // Reads imgdata from a file.
    imgdata, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }

    // Decodes an image.
    img, _, err := image.Decode(bytes.NewReader(imgdata))
    if err != nil {
        fmt.Printf("image.Decode error: %v\n", err)
        return
    }

    // Recognize QR Codes.
    qrCodes, err := goqr.Recognize(img)
    if err != nil {
        fmt.Printf("Recognize failed: %v\n", err)
        return
    }

}

Extract data from the image and print it to standard output.

func scanQRCode(path string) {
    
    // Reads imgdata from a file.
    imgdata, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }

    // Decodes an image.
    img, _, err := image.Decode(bytes.NewReader(imgdata))
    if err != nil {
        fmt.Printf("image.Decode error: %v\n", err)
        return
    }

    // Recognize QR Codes.
    qrCodes, err := goqr.Recognize(img)
    if err != nil {
        fmt.Printf("Recognize failed: %v\n", err)
        return
    }
    
    // Prints a list of QR Codes.
    for _, qrCode := range qrCodes {
        fmt.Printf("qrCode text: %s\n", qrCode.Payload)
    }
    return
}

Finally, call the function in your code and provide the image file to decode.

package main

import (
    "image"
    "io/ioutil"
    "bytes"
    "fmt"

    // github. com liyue201 GOQR
    "github.com/liyue201/goqr"
)


func scanQRCode(path string) {
    
    // Reads imgdata from a file.
    imgdata, err := ioutil.ReadFile(path)
    if err != nil {
        fmt.Printf("%v\n", err)
        return
    }

    // Decodes an image.
    img, _, err := image.Decode(bytes.NewReader(imgdata))
    if err != nil {
        fmt.Printf("image.Decode error: %v\n", err)
        return
    }

    // Recognize QR Codes.
    qrCodes, err := goqr.Recognize(img)
    if err != nil {
        fmt.Printf("Recognize failed: %v\n", err)
        return
    }
    
    // Prints a list of QR Codes.
    for _, qrCode := range qrCodes {
        fmt.Printf("qrCode text: %s\n", qrCode.Payload)
    }
    return
}

func main() {
    

    // file to write to
    filenameW := "qrcode.png"
    // scanQRCode scans a QR code image file.
    scanQRCode(filenameW)

}

Conclusion

In this tutorial, we used Golang to write a program which can encode or decode QR code image files. You can modify the code to use other types of bar codes.