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.