go语言web开发系列之二十一:用go-qrcode库生成二维码

一,安装用到的库

1,go-qrcode库的地址

https://github.com/skip2/go-qrcode

2,安装go-qrcode库

liuhongdi@ku:~$ go get -u github.com/skip2/go-qrcode/...

3,resize库的地址(在二维码中间放icon时太大时需要缩放)

https://github.com/nfnt/resize

4,安装resize库:

liuhongdi@ku:~$ go get -u github.com/nfnt/resize

说明:刘宏缔的go森林是一个专注golang的博客,
          地址:https://blog.csdn.net/weixin_43881017

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,地址:

https://github.com/liuhongdi/digv21

2,功能说明:演示了生成不带icon的二维码和带icon的二维码

3,项目结构:如图:

三,go代码说明

1,controller/codeController.go

  1.  
    package controller
  2.  
     
  3.  
    import (
  4.  
    "fmt"
  5.  
    "github.com/gin-gonic/gin"
  6.  
    "github.com/skip2/go-qrcode"
  7.  
    "github.com/nfnt/resize"
  8.  
    "image"
  9.  
    "image/draw"
  10.  
    "image/gif"
  11.  
    "image/jpeg"
  12.  
    "image/png"
  13.  
    "os"
  14.  
    "path/filepath"
  15.  
    "strings"
  16.  
    )
  17.  
     
  18.  
    type CodeController struct{}
  19.  
     
  20.  
    func NewCodeController() CodeController {
  21.  
    return CodeController{}
  22.  
    }
  23.  
    //生成一个二维码
  24.  
    func (g *CodeController) GetOne(c *gin.Context) {
  25.  
    //保存path
  26.  
    pngpath:="/data/liuhongdi/digv21/static/images/q.png"
  27.  
     
  28.  
    //生成二维码
  29.  
    url:="http://www.baidu.com/"
  30.  
    qrCode, err := qrcode.New(url, qrcode.Highest)
  31.  
    if err != nil {
  32.  
    fmt.Println(err)
  33.  
    return
  34.  
    }
  35.  
    qrCode.DisableBorder = true
  36.  
     
  37.  
    //保存成文件
  38.  
    qrCode.WriteFile(256,pngpath)
  39.  
    //显示二维码
  40.  
    pngurl:= "/static/images/q.png"
  41.  
    html:="<img src='"+pngurl+"' />"
  42.  
    c.Header("Content-Type", "text/html; charset=utf-8")
  43.  
    c.String(200, html)
  44.  
    return
  45.  
    }
  46.  
     
  47.  
    //生成一个中间带icon的二维码
  48.  
    func (g *CodeController) GetIcon(c *gin.Context) {
  49.  
     
  50.  
    var (
  51.  
    bgImg image.Image
  52.  
    offset image.Point
  53.  
    avatarFile *os.File
  54.  
    avatarImg image.Image
  55.  
    )
  56.  
    //png图片的本地保存路径
  57.  
    pngpath:="/data/liuhongdi/digv21/static/images/q2.png"
  58.  
    //url,创建二维码
  59.  
    url:="http://www.baidu.com/"
  60.  
    qrCode, err := qrcode.New(url, qrcode.Highest)
  61.  
    if err != nil {
  62.  
    //return nil, errors.New("创建二维码失败")
  63.  
    fmt.Println(err)
  64.  
    return
  65.  
    }
  66.  
    qrCode.DisableBorder = true
  67.  
    bgImg = qrCode.Image(256)
  68.  
    //icon的路径
  69.  
    headpath:="/data/liuhongdi/digv21/static/images/head.jpeg"
  70.  
    avatarFile, err = os.Open(headpath)
  71.  
    avatarImg, err = jpeg.Decode(avatarFile)
  72.  
    //修改图片的大小
  73.  
    avatarImg = resize.Resize(40, 40, avatarImg, resize.Lanczos3)
  74.  
     
  75.  
    //得到背景图的大小
  76.  
    b := bgImg.Bounds()
  77.  
    //居中设置icon到二维码图片
  78.  
    offset = image.Pt((b.Max.X-avatarImg.Bounds().Max.X)/2, (b.Max.Y-avatarImg.Bounds().Max.Y)/2)
  79.  
    m := image.NewRGBA(b)
  80.  
    draw.Draw(m, b, bgImg, image.Point{X: 0, Y: 0,}, draw.Src)
  81.  
    draw.Draw(m, avatarImg.Bounds().Add(offset), avatarImg, image.Point{X: 0, Y: 0}, draw.Over)
  82.  
     
  83.  
    //save image
  84.  
    errsave:=SaveImage(pngpath,m)
  85.  
    if (errsave != nil){
  86.  
    fmt.Println(errsave)
  87.  
    }
  88.  
    //显示图片
  89.  
    pngurl:= "/static/images/q2.png"
  90.  
    html:="<img src='"+pngurl+"' />"
  91.  
    c.Header("Content-Type", "text/html; charset=utf-8")
  92.  
    c.String(200, html)
  93.  
    return
  94.  
    }
  95.  
     
  96.  
    //保存image
  97.  
    func SaveImage(p string, src image.Image) error {
  98.  
    f, err := os.OpenFile(p, os.O_SYNC|os.O_RDWR|os.O_CREATE, 0666)
  99.  
    if err != nil {
  100.  
    return err
  101.  
    }
  102.  
    defer f.Close()
  103.  
    ext := filepath.Ext(p)
  104.  
    if strings.EqualFold(ext, ".jpg") || strings.EqualFold(ext, ".jpeg") {
  105.  
    err = jpeg.Encode(f, src, &jpeg.Options{Quality: 80})
  106.  
    } else if strings.EqualFold(ext, ".png") {
  107.  
    err = png.Encode(f, src)
  108.  
    } else if strings.EqualFold(ext, ".gif") {
  109.  
    err = gif.Encode(f, src, &gif.Options{NumColors: 256})
  110.  
    }
  111.  
    return err
  112.  
    }

2,其他相关代码可以访问github查看

四,测试效果

1,查看生成普通的二维码:

访问:

http://127.0.0.1:8080/code/getone

返回:

2,查看生成带icon或头像的二维码:

访问:

http://127.0.0.1:8080/code/geticon

返回:

五,查看库的版本:

  1.  
    module github.com/liuhongdi/digv21
  2.  
     
  3.  
    go 1.15
  4.  
     
  5.  
    require (
  6.  
    github.com/gin-gonic/gin v1.6.3
  7.  
    github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
  8.  
    github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086
  9.  
    )
原文地址:https://www.cnblogs.com/ExMan/p/14312302.html