golang 生成二维码海报的实现代码
- 作者: 名字起的太长不太好吧
- 来源: 51数据库
- 2021-08-03
生成带头像的二维码
import (
"errors"
"fmt"
"github.com/nfnt/resize"
"github.com/skip2/go-qrcode"
"image"
"image/draw"
"image/png"
"os"
)
var err error
func createavatar() (image.image, error) {
var (
bgimg image.image
offset image.point
avatarfile *os.file
avatarimg image.image
)
bgimg, err = createqrcode("http://www.51sjk.com/Upload/Articles/1/0/254/254024_20210627003707404.com")
if err != nil {
fmt.println("创建二维码失败:", err)
return nil, errors.new("创建二维码失败")
}
avatarfile, err = os.open("./avatar.png")
avatarimg, err = png.decode(avatarfile)
avatarimg = imageresize(avatarimg, 40, 40)
b := bgimg.bounds()
// 设置为居中
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)
return m, err
}
func createqrcode(content string) (img image.image, err error) {
var qrcode *qrcode.qrcode
qrcode, err = qrcode.new(content, qrcode.highest)
if err != nil {
return nil, errors.new("创建二维码失败")
}
qrcode.disableborder = true
img = qrcode.image(150)
return img, nil
}
func imageresize(src image.image, w, h int) image.image {
return resize.resize(uint(w), uint(h), src, resize.lanczos3)
}
预览

合成到海报
func main() {
var (
bgfile *os.file
bgimg image.image
qrcodeimg image.image
offset image.point
)
// 01: 打开背景图片
bgfile, err = os.open("./bg.png")
if err != nil {
fmt.println("打开背景图片失败", err)
return
}
defer bgfile.close()
// 02: 编码为图片格式
bgimg, err = png.decode(bgfile)
if err != nil {
fmt.println("背景图片编码失败:", err)
return
}
// 03: 生成二维码
qrcodeimg, err = createavatar()
if err != nil {
fmt.println("生成二维码失败:", err)
return
}
offset = image.pt(426, 475)
b := bgimg.bounds()
m := image.newrgba(b)
draw.draw(m, b, bgimg, image.point{x: 0, y: 0,}, draw.src)
draw.draw(m, qrcodeimg.bounds().add(offset), qrcodeimg, image.point{x: 0, y: 0}, draw.over)
// 上传至oss时这段要改
i, _ := os.create(path.base("a2.png"))
_ = png.encode(i, m)
defer i.close()
}
预览

上传至阿里云
func ossclient() (bucket *alioss.bucket, err error) {
var (
key string = "xxx"
bucketname string = "xxx"
secret string = "xxx"
endpoint string = "xxx"
)
// 创建ossclient实例。
client, err = alioss.new(endpoint, key, secret)
if err != nil {
fmt.println("获取阿里云oss实例失败:", err)
return nil, errors.new("资源服务器配置有误")
}
// 获取存储空间。
bucket, err = client.bucket(bucketname)
if err != nil {
logger.error("获取阿里云oss存储空间错误:", err)
return nil, errors.new("获取存储服务器失败")
}
return bucket, nil
}
开始上传
将之前注释的那段删除 修改成这段
bucket, err = ossclient()
if err != nil {
fmt.println("error:", err)
return
}
imgbuff := bytes.newbuffer(nil) //开辟一个新的空buff
err = png.encode(imgbuff, m) //img写入到buff
if err != nil {
fmt.println("写入缓冲区失败",err)
return
}
err = bucket.putobject("qrcode/2-1.png", imgbuff)
fmt.println("error:", err)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
