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)

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

(0)

相关推荐

  • Golang map如何生成有序的json数据详解

    前言 本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先来看一段 Golang 生成 json 的代码,首先定义了一个 map[string]interface{}  的变量,然后存一些值,这里要注意的是 previews 字段,为了浏览器获取到的 json 数据是有序的,所以定义了一个 map[int]map[string]string 的类型,加上了一个表示顺序的键: list := make(map[strin

  • Golang编程实现生成n个从a到b不重复随机数的方法

    本文实例讲述了Golang编程实现生成n个从a到b不重复随机数的方法.分享给大家供大家参考,具体如下: 代码很简单: 复制代码 代码如下: package test import (     "fmt"     "math/rand"     "time" ) //生成若干个不重复的随机数 func RandomTestBase() {     //测试5次     for i := 0; i < 5; i++ {         nums

  • Golang中生成随机字符串并复制到粘贴板的方法

    前段时间在生活中偶尔需要对某些文件进行重命名,而且是随机名字,刚 开始是手动重命名然后在键盘上胡乱打一些字母数字,时间长了发现也挺麻烦的,于是想到能不能用golang实现这个功能并且自动把生成的字符串 复制到粘贴板,然后生成exe文件,要用的是直接鼠标双击就行.说干就干. 网上搜了些相关资料,于是写了出来. 安装必要的库 go get github.com/atotto/clipboard 代码实现 package main import ( "fmt" "github.co

  • 利用Golang生成整数随机数方法示例

    php随机数 生成一个给定范围的随机数,用 PHP 就太简单不过了,而且可以指定从负数到正整数的范围,如: <?php echo mt_rand(-988, 888); 这样就随机生成 -988 到 888 的随机数. 使用 Go 就要稍微麻烦一点.以下两个函数分别是生成一个最大范围内随机整数,和生成一个区间范围的随机整数: 生成一个最大范围内随机数 一定要给一个时间戳的种子,否则每次生成都是一样的值.这里就是生成 [0,100) 的随机数. func GenerateRandnum() int

  • 在Golang代码中如何自动生成版本号的方法示例

    前言 以前在写C/C++代码时,可以在代码中预定义一些版本宏定义,然后再编译时从外部传入数据作为版本号. golang代码不支持宏定义,如果每次在代码中硬编码版本信息,一来费时费力,二来很容易忘记更新. 如何更优雅的维护golang程序的版本号呢? 翻阅golang文档之后,在go build发现下面的参数 -ldflags 'flag list' arguments to pass on each go tool link invocation. 然后在linker中发现: -X import

  • golang生成指定位数的随机数的方法

    1.随机数 随机数,是使用一个确定性的算法计算出来随机数序.在程序开发中经常需要产生随机数,如随机数验证码登陆.作为唯一身份标识数据等等. 2.rand库 golang中产生随机数主要有两个包,分别是"math/rand"和"crypto/rand". "math/rand"的rand包实现了伪随机数生成器. "crypto/rand"的rand包实现了用于加解密的更安全的随机数生成器. 3.生成指定位数随机数 以生成六位随机

  • 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,

  • VUE微信H5生成二维码海报保存在本地相册的实现

    目录 一.效果 二.说明 三.思路 四.效果 五.代码实现 六.遇到的问题 一.效果 二.说明 公司需求:宣传海报从后台获取,二维码地址也从后台获得,然后生成一个海报,海报上固定位置放二维码,长按图片可以保存在本地相册(其实前面的需求是点击按钮,下载海报图到本地相册,然后h5下载的实现原理是生成一个a标签链接,然后下载,在电脑模拟器可以下载,在微信浏览器一点反应没有,所以退一步,长按保存),下面是使用版本,UI插件用的是vant(有赞) vue:“^2.6.11”, “html2canvas”:

  • 利用java生成二维码工具类示例代码

    二维码介绍 二维条形码最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理. 如下为java生成二维码工具类,可以选择生成文件,或者直接在页面生成,话不多说了,来一起看看详细的示例代码吧. 示例代码 import java.aw

  • java中使用zxing批量生成二维码立牌

    使用zxing批量在做好的立牌背景图的指定位置上,把指定的文本内容(链接地址.文本等)生成二维码并放在该位置,最后加上立牌编号. 步骤: 1).做好背景图,如下图: 2).生成二维码BufferedImage对象.代码如下: /** * * @Title: toBufferedImage * @Description: 把文本转化成二维码图片对象 * @param text * 二维码内容 * @param width * 二维码高度 * @param height * 二位宽度 * @para

  • PHP生成(支持多模板)二维码海报代码

    增加模板: 1.qrcode.*** 开头的 文件夹,比如:qrcode.demoABC 2.在第一步创建的文件夹中配置文件config.php,以上面的例子为:qrcode.demoABC/config.php <?php return array( //二维码部分 'level' => "L", //二维码校正级别,可选:L.M.Q.H 'matrix' => 6, //矩阵的大小, 1-10 'type' => 'png', //二维码 输出类型 /**

  • PHP基于phpqrcode类生成二维码的方法详解

    本文实例讲述了PHP基于phpqrcode类生成二维码的方法.分享给大家供大家参考,具体如下: 使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手.然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码. 前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/p

  • Java基于zxing生成二维码矩阵过程解析

    这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件,也可使用maven添加依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> </dependency> 下面是将生成的二维码矩阵写入

  • 详解ZXing-core生成二维码的方法并解析

    二维码无处不在,扫一扫有礼品哦,现在二维码这么流行,想必大家不是很清楚二维码是怎么生成的吧,现在小编通过给大家分享本文帮助大家学习二维码生成的方法. 其实主要是利用goggle发布的jar来使用的此功能. 1.二维码的生成 将Zxing-core.jar 包加入到classpath下. 二维码的生成需要借助MatrixToImageWriter类,该类是由Google提供的,可以将该类拷贝到源码中,这里我将该类的源码贴上,可以直接使用. 直接可以生成二维码的代码 public void test

  • Yii2.0实现生成二维码功能实例

    本文实例讲述了Yii2.0实现生成二维码功能.分享给大家供大家参考,具体如下: 通过composer安装: 1.下面的方法是通过composer加载 php composer.phar require "2amigos/yii2-qrcode-helper" "*" 或者添加 "2amigos/yii2-qrcode-helper" : "*" 到对应项目的composer.json文件中 通过归档文件安装: 不习惯用comp

  • 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码  Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: $urlToEncode="http://www.jb51.net"; generateQRfromGoogle($urlToEncode); /** * google api 二维码生成[QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式] * @param string $chl 二维码包含的信息,可以是数字.字符.二进制信

随机推荐