zoukankan      html  css  js  c++  java
  • 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.  
      )
  • 相关阅读:
    eslint自动格式化
    焕肤功能
    Web Components
    Webpack 中的 sideEffects
    andriod 新建Activity_ Form
    那么唯美
    C# PDF添加水印
    停止触发器
    sp_sys_ERPTrigger_base
    sql语句返回主键SCOPE_IDENTITY()
  • 原文地址:https://www.cnblogs.com/ExMan/p/14312302.html
Copyright © 2011-2022 走看看