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

一,安装用到的库

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 controller

import (
	"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) {
    //保存path
	pngpath:="/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.Image
		offset  image.Point
		avatarFile *os.File
		avatarImg 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 = true
    bgImg = 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 image
	errsave:=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/digv21

go 1.15

require (
	github.com/gin-gonic/gin v1.6.3
	github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
	github.com/skip2/go-qrcode v0.0.0-20191027152451-9434209cb086
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老刘你真牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值