Go语言生成二维码是如此简单

Go语言精选

共 2661字,需浏览 6分钟

 ·

2020-08-09 05:41

二维码作为一种快速的输入手段越来越流行,支付,添加好友,买东西,扫个二维码就可以,非常方便。那么二维码是如何制作生成的呢?我们如何制作自己的二维码呢?

什么是二维码?

二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。

以上节选自维基百科。

Go语言生成二维码图片

使用Go语言编程时,生成任意内容的二维码是非常方便的,因为我们有go-qrcode这个库。该库的源代码托管在github上,大家可以下载使用 https://github.com/skip2/go-qrcode。

这个库的使用很简单,假如我要以我的博客网站地址http://www.flysnow.org生成一张256*256的图片,可以使用如下代码:

import "github.com/skip2/go-qrcode"

func main() {
   qrcode.WriteFile("http://www.flysnow.org/",qrcode.Medium,256,"./blog_qrcode.png")
}

这样我们运行代码的时候,就在当前目录下,生成一张256*256的二维码,扫描后可以看到内容是http://www.flysnow.org/

func WriteFile(content string, level RecoveryLevel, size int, filename string) error

WriteFile函数的原型定义如上,它有几个参数,大概意思如下:

  1. content表示要生成二维码的内容,可以是任意字符串。

  2. level表示二维码的容错级别,取值有Low、Medium、High、Highest。

  3. size表示生成图片的width和height,像素单位。

  4. filename表示生成的文件名路径。

RecoveryLevel类型其实是个int,它的定义和常量如下。

type RecoveryLevel int

const (
   // Level L: 7% error recovery.
   Low RecoveryLevel = iota

   // Level M: 15% error recovery. Good default choice.
   Medium    
   // Level Q: 25% error recovery.
   High    
   // Level H: 30% error recovery.
   Highest
)

RecoveryLevel越高,二维码的容错能力越好。

生成二维码图片字节

有时候我们不想直接生成一个PNG文件存储,我们想对PNG图片做一些处理,比如缩放了,旋转了,或者网络传输了等,基于此,我们可以使用Encode函数,生成一个PNG 图片的字节流,这样我们就可以进行各种处理了。

func Encode(content string, level RecoveryLevel, size int) ([]byte, error)

用法和WriteFile函数差不多,只不过返回的是一个[]byte字节数组,这样我们就可以对这个字节数组进行处理了。

自定义二维码

除了以上两种快捷方式,该库还为我们提供了对二维码的自定义方式,比如我们可以自定义二维码的前景色和背景色等。qrcode.New函数可以返回一个*QRCode,我们可以对*QRCode设置,实现对二维码的自定义。

比如我们设置背景色为绿色,前景色为白色的二维码

func main() {
   qr,err:=qrcode.New("http://www.flysnow.org/",qrcode.Medium)
   if err != nil {
       log.Fatal(err)
   } else {
       qr.BackgroundColor = color.RGBA{50,205,50,255}
       qr.ForegroundColor = color.White
       qr.WriteFile(256,"./blog_qrcode.png")
   }
}

指定*QRCodeBackgroundColorForegroundColor即可。然后调用WriteFile方法生成这个二维码文件。

func New(content string, level RecoveryLevel) (*QRCode, error)

// A QRCode represents a valid encoded QRCode.
type QRCode struct {
   // Original content encoded.
   Content string

   // QR Code type.
   Level         RecoveryLevel
   VersionNumber int

   // User settable drawing options.
   ForegroundColor color.Color
   BackgroundColor color.Color
}

以上QRCode的这些字段都是可以设置的,这样我们就可以灵活自定义二维码了。

小结

二维码是一种流行的输入技术手段,不光Go可以生成,其他语言也可以生成,并且生成的二维码是标准的,都可以扫描和识别,比如Java可以通过这个https://github.com/kenglxn/QRGen库来生成。




推荐阅读



学习交流 Go 语言,扫码回复「进群」即可


站长 polarisxu

自己的原创文章

不限于 Go 技术

职场和创业经验


Go语言中文网

每天为你

分享 Go 知识

Go爱好者值得关注


浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报