golang 生成二维码海报

李昊天

生成带头像的二维码

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.baidu.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)  
}

预览

image.png

合成到海报

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()  
  
}

预览

image.png

上传至阿里云

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)
阅读 4.3k

学无止境
学无止境,不懂就问

提升就是一个不懂到懂的过程;

1.8k 声望
365 粉丝
0 条评论

提升就是一个不懂到懂的过程;

1.8k 声望
365 粉丝
文章目录
宣传栏