一,安装用到的库
1,go-qrcode库的地址
GitHub - skip2/go-qrcode: :sparkles: QR Code encoder (Go)
2,安装go-qrcode库
liuhongdi@ku:~$ go get -u github.com/skip2/go-qrcode/...
3,resize库的地址(在二维码中间放icon时太大时需要缩放)
GitHub - nfnt/resize: Pure golang image resizing
4,安装resize库:
liuhongdi@ku:~$ go get -u github.com/nfnt/resize
说明:刘宏缔的go森林是一个专注golang的博客,
网站:https://blog.imgtouch.com
原文: go语言web开发系列之二十一:用go-qrcode库生成二维码 – 架构森林
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,演示项目的相关信息
1,地址:
GitHub - liuhongdi/digv21: 用go-qrcode库生成二维码
2,功能说明:演示了生成不带icon的二维码和带icon的二维码
3,项目结构:如图:

三,go代码说明
1,controller/codeController.go
package controllerimport ("fmt""github.com/gin-gonic/gin""github.com/skip2/go-qrcode""github.com/nfnt/resize""image""image/draw""image/gif""image/jpeg""image/png""os""path/filepath""strings"
)type CodeController struct{}func NewCodeController() CodeController {return CodeController{}
}
//生成一个二维码
func (g *CodeController) GetOne(c *gin.Context) {//保存pathpngpath:="/data/liuhongdi/digv21/static/images/q.png"//生成二维码url:="http://www.baidu.com/"qrCode, err := qrcode.New(url, qrcode.Highest)if err != nil {fmt.Println(err)return}qrCode.DisableBorder = true//保存成文件qrCode.WriteFile(256,pngpath)//显示二维码pngurl:= "/static/images/q.png"html:="<img src='"+pngurl+"' />"c.Header("Content-Type", "text/html; charset=utf-8")c.String(200, html)return
}//生成一个中间带icon的二维码
func (g *CodeController) GetIcon(c *gin.Context) {var (bgImg image.Imageoffset image.PointavatarFile *os.FileavatarImg image.Image)//png图片的本地保存路径pngpath:="/data/liuhongdi/digv21/static/images/q2.png"//url,创建二维码url:="http://www.baidu.com/"qrCode, err := qrcode.New(url, qrcode.Highest)if err != nil {//return nil, errors.New("创建二维码失败")fmt.Println(err)return}qrCode.DisableBorder = truebgImg = qrCode.Image(256)//icon的路径headpath:="/data/liuhongdi/digv21/static/images/head.jpeg"avatarFile, err = os.Open(headpath)avatarImg, err = jpeg.Decode(avatarFile)//修改图片的大小avatarImg = resize.Resize(40, 40, avatarImg, resize.Lanczos3)//得到背景图的大小b := bgImg.Bounds()//居中设置icon到二维码图片offset = image.Pt((b.Max.X-avatarImg.Bounds().Max.X)/2, (b.Max.Y-avatarImg.Bounds().Max.Y)/2)m := image.NewRGBA(b)draw.Draw(m, b, bgImg, image.Point{X: 0, Y: 0,}, draw.Src)draw.Draw(m, avatarImg.Bounds().Add(offset), avatarImg, image.Point{X: 0, Y: 0}, draw.Over)//save imageerrsave:=SaveImage(pngpath,m)if (errsave != nil){fmt.Println(errsave)}//显示图片pngurl:= "/static/images/q2.png"html:="<img src='"+pngurl+"' />"c.Header("Content-Type", "text/html; charset=utf-8")c.String(200, html)return
}//保存image
func SaveImage(p string, src image.Image) error {f, err := os.OpenFile(p, os.O_SYNC|os.O_RDWR|os.O_CREATE, 0666)if err != nil {return err}defer f.Close()ext := filepath.Ext(p)if strings.EqualFold(ext, ".jpg") || strings.EqualFold(ext, ".jpeg") {err = jpeg.Encode(f, src, &jpeg.Options{Quality: 80})} else if strings.EqualFold(ext, ".png") {err = png.Encode(f, src)} else if strings.EqualFold(ext, ".gif") {err = gif.Encode(f, src, &gif.Options{NumColors: 256})}return err
}
2,其他相关代码可以访问github查看
四,测试效果
1,查看生成普通的二维码:
访问:
http://127.0.0.1:8080/code/getone
返回:

2,查看生成带icon或头像的二维码:
访问:
http://127.0.0.1:8080/code/geticon
返回:

五,查看库的版本:
module github.com/liuhongdi/digv21go 1.15require (github.com/gin-gonic/gin v1.6.3github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086
)



![Go语言WEB开发[html/template包]](https://img-blog.csdnimg.cn/c1edb049bfd841c09cffb0006a02bef0.png)







