go生成带logo的二维码!(补充)

代码:

package main

import (
	"bytes"
	"encoding/base64"
	"fmt"

	"github.com/nfnt/resize"

	"image"
	_ "image/jpeg"
	"image/png"

	"github.com/skip2/go-qrcode"
	"golang.org/x/image/draw"

	"os"
)

// CreateQrCodeBs64WithLogo  带logo的二维码图片生成 content-二维码内容    size-像素单位   logoPath-logo文件路径
func CreateQrCodeBs64WithLogo(content, logoPath, outPath string, size int) (data string, err error) {
	code, err := qrcode.New(content, qrcode.High)
	if err != nil {
		return
	}
	//code.DisableBorder = true
	//设置文件大小并创建画板
	qrcodeImg := code.Image(size)
	outImg := image.NewRGBA(qrcodeImg.Bounds())

	//读取logo文件
	logoFile, err := os.Open(logoPath)
	if err != nil {
		return
	}
	logoImg, _, _ := image.Decode(logoFile)
	logoImg = resize.Resize(uint(size/10), 0, logoImg, resize.Lanczos3)

	// 添加边框
	// 图片到边框距离
	pic2FramePadding := logoImg.Bounds().Dx() / 10

	// 新建一个边框图层
	transparentImg := image.NewRGBA(image.Rect(0, 0, logoImg.Bounds().Dx()+pic2FramePadding, logoImg.Bounds().Dy()+pic2FramePadding))
	// 图层颜色设为白色
	draw.Draw(transparentImg, transparentImg.Bounds(), image.White, image.Point{}, draw.Over)
	// 将缩略图放到透明图层上
	draw.Draw(transparentImg,
		image.Rect(pic2FramePadding/2, pic2FramePadding/2, transparentImg.Bounds().Dx(), transparentImg.Bounds().Dy()),
		logoImg,
		image.Point{},
		draw.Over)

	//logo和二维码拼接
	draw.Draw(outImg, outImg.Bounds(), qrcodeImg, image.Pt(0, 0), draw.Over)
	offset := image.Pt((outImg.Bounds().Max.X-transparentImg.Bounds().Max.X)/2, (outImg.Bounds().Max.Y-transparentImg.Bounds().Max.Y)/2)
	draw.Draw(outImg, outImg.Bounds().Add(offset), transparentImg, image.Pt(0, 0), draw.Over)

	buf := new(bytes.Buffer)
	_ = png.Encode(buf, outImg)

	// 写入文件
	f, _ := os.Create(outPath)
	_ = png.Encode(f, outImg)

	res := base64.StdEncoding.EncodeToString(buf.Bytes())
	return res, nil
}

func main() {
	s, err := CreateQrCodeBs64WithLogo("http://www.alingfeng.cn/",
		"logo.png",
		"qr.png", 512)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(s)
}


结果:

点赞0
点击评论0
收藏0
浏览 84
 

还没有评论,快来发表第一个评论吧

免责声明:凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,注册用户和一般页面游览者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任(包括侵权责任、合同责任和其它责任)
*尊重作者,转载请注明出处!

创作内容

开启你的爱凌峰创作之旅

发布首篇内容,开通创作中心
快来成为爱凌峰创作者吧~

写文章

板块热门【Golang】