二维码作为一种快速输入法越来越受欢迎。支付、加好友、买东西,扫个二维码,非常方便。那么二维码是如何生成的呢?我们如何制作自己的二维码?什么是二维码?二维条码是在一维条码的基础上扩展出来的一种可读条码,用黑白相间的矩形图案来表示二进制数据,通过设备扫描后可以得到其中包含的信息。一维条码的宽度记录数据,长度不记录数据。数据记录在二维条码的长度和宽度上。二维条码具有一维条码所没有的“定位点”和“容错机制”。容错机制可以在所有条码无法识别或条码被污损的情况下正确恢复条码上的信息。以上摘自维基百科。Go语言生成二维码图片在用Go语言编程的时候,生成任意内容的二维码是非常方便的,因为我们有go-qrcode这个库。该库的源代码托管在github上,你可以下载使用https://github.com/skip2/go-qrcode。这个库的使用非常简单。如果我想用我的博客网址http://www.flysnow.org生成一张256*256的图片,可以使用如下代码:WriteFile("http://www.flysnow.org/",qrcode.Medium,256,"./blog_qrcode.png")}这样我们运行代码的时候,就会在当前目录下,生成一个256*256二维码,扫描后可以看到内容是http://www.flysnow.org/。funcWriteFile(contentstring,levelRecoveryLevel,sizeint,filenamestring)errorWriteFile函数的原型定义如上,它有几个参数,大致意思如下:content表示要生成的二维码的内容,可以是任意的细绳。level表示二维码的容错级别,取值有Low、Medium、High、Highest。size表示生成图像的宽度和高度,以像素为单位。filename表示生成的文件名路径。RecoveryLevel类型其实是一个int,它的定义和常量如下。typeRecoveryLevelintconst(//LevelL:7%errorrecovery.LowRecoveryLevel=iota//LevelM:15%errorrecovery.Gooddefaultchoice.Medium//LevelQ:25%errorrecovery.High//LevelH:30%errorrecovery.Highest)RecoveryLevel越高,QRcode容错性越好。生成二维码图片字节有时我们不想直接生成一个PNG文件进行存储,我们想对PNG图片做一些处理,比如缩放,旋转,或者网络传输等。基于此,我们可以使用Encode函数生成PNG图片的字节流,以便我们进行各种处理。funcEncode(contentstring,levelRecoveryLevel,sizeint)([]byte,error)和WriteFile函数类似,只不过它返回的是一个[]byte字节数组,这样我们就可以对这个字节数组进行处理了。自定义二维码除了上面两种快捷方式,库还为我们提供了自定义二维码的方法,比如我们可以自定义二维码的前景色和背景色。qrcode.New函数可以返回一个*QRCode,我们可以通过设置*QRCode来实现二维码的自定义。比如我们设置背景色为绿色,前景色为白色二维码funcmain(){qr,err:=qrcode.New("http://www.flysnow.org/",qrcode.Medium)iferr!=nil{log.Fatal(err)}else{qr.BackgroundColor=color.RGBA{50,205,50,255}qr.ForegroundColor=color.Whiteqr.WriteFile(256,"./blog_qrcode.png")}}指定背景颜色*QRCode和ForegroundColor都可以。然后调用WriteFile方法生成二维码文件。funcNew(contentstring,levelRecoveryLevel)(*QRCode,error)//AQRCode代表validencodedQRCode.typeQRCodestruct{//Originalcontentencoded.Contentstring//QRCodetype.LevelRecoveryLevelVersionNumberint//Usersettabledrawingoptions.ForegroundColorcolor.ColorCodegroundColor.以上字段都是可设置的}QRcolor我们可以灵活自定义QR代码。总结二维码是一种流行的输入技术。不仅可以用Go生成,也可以用其他语言生成。生成的二维码是标准的,可以扫描识别。比如Java可以通过这个https://github.com/kenglxn/QRGen库来生成。
