最近遇到一种二维码,这种二维码是个动画,动画中的每个二维码都不同,不停的变,但是用微信扫描的时候还都可以用。这种二维码可以很好的吸引注意、可以节省图片空间(只需要发一个就好)。下面是我用自己的公众号做的二维码动画,不管你怎么扫描打开的都是我的公众号,但是不同的是会区分来源的渠道不同。

公众号二维码动画

我们都知道gif动画是由一张张图片,按照一定的顺序排列,并且安排一定的速度切换形成的动画。那么要想做一个公众号的二维码动画,首先我们得有很多种公众号的二维码。

我的公众号的地址是:http://weixin.qq.com/r/NjhqctXEt4jIrZER920k,我可以用这个地址来生成公众号的二维码,这种其他人扫描的时候,就可以关注我的公众号[飞雪无情]了。

假设现在我们已经通过这个地址(内容)生成公众号的二维码,但是我们要生成多个怎么办呢?最直接的思路就是改变地址,只有改变它,才能改变用于生成二维码的内容,这样生成的二维码才会不同。但是我们还有个前提是还要可以打开关注我们的公众号,所以我们只能为这个地址添加一些参数,这样二维码的功能不变,但是生成的二维码改变了。比如我这里添加一个渠道参数,用于标记用户的来源。

  1. http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel=baidu
  2. http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel=weixin
  3. http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel=qq
  4. http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel=toutiao

以上的就是我们添加参数后的示例,有的用户从百度来,有的从头条,有的从微信等等。这种我们就有了不同的地址,现在我们就可以用他们生成不同的二维码图片了。

要生成二维码,我们需要使用github.com/skip2/go-qrcode这个库,我以前有过介绍,可以参考 https://www.flysnow.org/2017/09/29/go-qrcode.html

1
qrcode.WriteFile("http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel=baidu",qrcode.Medium,256,"./weixin_mp.png")

以上就可以生成一个大小为256*256的问二维码图片了,非常简单,只需要一行代码。我们更换地址内容就可以生成不同的二维码了,这样我们就有了多张二维码图片,就可以开始制作公众号二维码动画了。

1
channels := []string{"weixin", "toutiao", "qq", "baidu"}

为了便于代码的扩展,我先定义了用户的来源渠道。

1
2
3
4
5
6
7
8
    for _, channel := range channels {
		q, err := qrcode.New("http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel="+channel,qrcode.Medium)
		if err == nil {
			qrImage := q.Image(qrcodeSize)
			qrGif.Image = append(qrGif.Image, qrImage.(*image.Paletted))
			qrGif.Delay = append(qrGif.Delay, 10)
		}
	}

以上代码就是我们改变二维码地址内容,生成不同的二维码,并且把他们添加到gif动画中,设置好0.1秒间隔变一次图片。

1
2
3
    qrFile, _ := os.OpenFile("qr_code.gif", os.O_WRONLY|os.O_CREATE, 0644)
    defer qrFile.Close()
	gif.EncodeAll(qrFile, qrGif)

最后我们生成这张二维码gif动画,用以上代码实现。现在我们打开生成的qr_code.gif,会看到二维码动画不停的变,拿起手机微信扫描下,就可以关注我的公众号飞雪无情

现在二维码动画生成好了,但是不美观,因为二维码的中间没有公众号的LOGO,我们可以看到微信为我们生成的公众号二维码是有这个头像LOGO的,这样整个二维码就好看多了,现在我们也实现这个功能,把我们的二维码动画美化一下。

二维码带LOGO头像的思路其实就是把我们的头像缩小,放到二维码头像的正中间即可。我们为每个二维码都添加一个头像LOGO,这样我们的公众号二维码动画就有了头像LOGO。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    for _, channel := range channels {
		q, err := qrcode.New("http://weixin.qq.com/r/NjhqctXEt4jIrZER920k?channel="+channel,qrcode.Medium)
		if err == nil {
			qrImage := q.Image(qrcodeSize)
			//添加头像LOGO
			palettedImage := image.NewPaletted(qrImage.Bounds(), palette.Plan9)
			draw.FloydSteinberg.Draw(palettedImage, qrImage.Bounds(), qrImage, image.Pt(0, 0))
			draw.FloydSteinberg.Draw(palettedImage, image.Rect((qrcodeSize-logoSize)/2,(qrcodeSize-logoSize)/2, (qrcodeSize-logoSize)/2+logoSize, (qrcodeSize-logoSize)/2+logoSize),headImage, image.Pt(0, 0))
			qrGif.Image = append(qrGif.Image, palettedImage)
			qrGif.Delay = append(qrGif.Delay, 10)
		}
	}

我们把生成二维码的代码改成这样,就为我们生成的每张二维码添加的头像LOGO。

现在,在运行一下代码吧,就可以看到美化后的公众号二维码动画了。

二维码动画因为含有多张图片,所以可以承载的信息也比较多,比如可以用来做活码拉人入群),用户随机扫描一个就可以直接入群,这样就可以解决群100人限制的问题。二维码动画的好处还有很多,等着大家去挖掘。

生成微信公众号二维码动画的完整源代码请扫码下方二维码,关注飞雪无情公众号后,公众号回复二维码三个字即可获得。

本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站asf https://www.flysnow.org/ ,第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。

扫码关注