golang 生成二维码海报的实现代码

 更新时间:2020年02月03日 08:31:18   作者:李昊天  
这篇文章主要介绍了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) 
}

预览

合成到海报

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Go递归修改文件名的实例代码

    Go递归修改文件名的实例代码

    这篇文章主要介绍了Go递归修改文件名的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的饿参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • go语法入门any类型的使用场景示例详解

    go语法入门any类型的使用场景示例详解

    这篇文章主要为大家介绍了go语法入门any类型的使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用Go语言实现配置文件热加载功能

    使用Go语言实现配置文件热加载功能

    这篇文章主要介绍了使用Go语言实现配置文件热加载功能,以及配置文件热加载包的实现思路,需要的朋友可以参考下
    2018-03-03
  • Golang 中 omitempty的作用

    Golang 中 omitempty的作用

    这篇文章主要介绍了Golang 中 omitempty的作用,文章围绕主题展开详细的内容介绍,具有一定的参考一下,需要的小伙伴可以参考一下
    2022-07-07
  • Go并发同步Mutex典型易错使用场景

    Go并发同步Mutex典型易错使用场景

    这篇文章主要为大家介绍了Go并发同步Mutex典型易错使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言无缓冲的通道的使用

    Go语言无缓冲的通道的使用

    Go语言中无缓冲的通道是指在接收前没有能力保存任何值的通道,本文主要介绍了Go语言无缓冲的通道的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Go Web 编程中的模板库应用指南(超详细)

    Go Web 编程中的模板库应用指南(超详细)

    这篇文章主要介绍了Go Web 编程中的模板库应用指南,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Go 1.18新特性之泛型的全面讲解

    Go 1.18新特性之泛型的全面讲解

    本文力求能让未接触过泛型编程的人也能较好理解Go的泛型,所以行文可能略显啰嗦。但是请相信我,看完这篇文章你能获得对Go泛型非常全面的了解
    2023-03-03
  • 一文搞懂Golang中的内存逃逸

    一文搞懂Golang中的内存逃逸

    我们都知道go语言中内存管理工作都是由Go在底层完成的,这样我们可以不用过多的关注底层的内存问题。本文主要总结一下 Golang内存逃逸分析,需要的朋友可以参考以下内容,希望对大家有帮助
    2022-09-09
  • 深入探究Go语言的错误策略与异常机制

    深入探究Go语言的错误策略与异常机制

    本文深入探讨了Go语言的错误策略与异常机制,主要介绍了错误处理的重要性,以及Go语言中的错误类型和处理函数,此外还讨论了Go语言的异常机制,包括panic和recover函数的使用,需要的朋友可以参考下
    2024-02-02

最新评论