Golang : Convert []byte to image
There are times when you need to convert []byte to image for saving into file purpose. I encountered one of this situation today as I need to save a generated QR code into PNG file.
In this short tutorial, we will learn how to convert []byte into image and save to a PNG file. Basically to convert to image, you just need to process the []byte variable with bytes.NewReader()
function and wrap it with image.Decode()
function.
See example :
imgByte := code.PNG()
// convert []byte to image for saving to file
img, _, _ := image.Decode(bytes.NewReader(imgByte))
//save the imgByte to file
out, err := os.Create("./QRImg.png")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
err = png.Encode(out, img)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
and the entire program :
package main
import (
"bytes"
"code.google.com/p/rsc/qr"
"crypto/rand"
"fmt"
"image"
"image/png"
"os"
"runtime"
)
func randStr(strSize int, randType string) string {
var dictionary string
if randType == "alphanum" {
dictionary = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
}
if randType == "alpha" {
dictionary = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
}
if randType == "number" {
dictionary = "0123456789"
}
var bytes = make([]byte, strSize)
rand.Read(bytes)
for k, v := range bytes {
bytes[k] = dictionary[v%byte(len(dictionary))]
}
return string(bytes)
}
func main() {
// maximize CPU usage for maximum performance
runtime.GOMAXPROCS(runtime.NumCPU())
// generate a random string - preferbly 6 or 8 characters
randomStr := randStr(6, "alphanum")
fmt.Println(randomStr)
// generate the link or any data you want to
// encode into QR codes
// in this example, we use an example of two factor
// authentication link. Replace the authTFAlink
// with yours.
authTFAlink := "otpauth://socketloop.com?key=" + randomStr + "&issuer=SocketLoop"
// Encode authTFAlink to QR codes
// qr.L = 20% redundant level
// see https://godoc.org/code.google.com/p/rsc/qr#Level
code, err := qr.Encode(authTFAlink, qr.L)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
imgByte := code.PNG()
// convert []byte to image for saving to file
img, _, _ := image.Decode(bytes.NewReader(imgByte))
//save the imgByte to file
out, err := os.Create("./QRImg.png")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
err = png.Encode(out, img)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// everything ok
fmt.Println("QR code generated and saved to QRimg.png")
}
References :
https://www.socketloop.com/tutorials/golang-save-image-to-png-jpeg-or-gif-format
https://www.socketloop.com/tutorials/golang-convert-an-image-file-to-byte
See also : Golang : Convert an image file to []byte
By Adam Ng
IF you gain some knowledge or the information here solved your programming problem. Please consider donating to the less fortunate or some charities that you like. Apart from donation, planting trees, volunteering or reducing your carbon footprint will be great too.
Advertisement
Tutorials
+5.9k Golang : How to verify input is rune?
+7.8k Javascript : How to check a browser's Do Not Track status?
+17.3k Golang : Get future or past hours, minutes or seconds
+4.7k Fix Google Analytics Redundant Hostnames problem
+8.6k Golang : Executing and evaluating nested loop in html template
+8.1k Prevent Write failed: Broken pipe problem during ssh session with screen command
+15.8k Golang : Read large file with bufio.Scanner cause token too long error
+13k Golang : List objects in AWS S3 bucket
+4.2k Golang : Converting individual Jawi alphabet to Rumi(Romanized) alphabet example
+17.1k Google Chrome : Your connection to website is encrypted with obsolete cryptography
+33.8k Golang : Call a function after some delay(time.Sleep and Tick)
+8.6k Golang : Find duplicate files with filepath.Walk