这段时间做一个模块,需要能自动生成二维码,查了不少资料,做一点总结吧。
1 二维码基本知识的资料,网上非常多,本质上就是一种数据的加密过程,设计到编码与校验,冗余等处理。这方面的资料就不展开了,可以自行搜索。
2 二维码相关的库,在手机上的库比较有名的是 zxing和zbar,google开源的库zxing比较合适。不过这些库都只有C++的解码,而不支持C++的编码,都有Java和C#相关的编码和解码。如果你是在手机上开发,这两个库都可以用。
3 Windows下,要编码的话,还有一个叫QR的库,优快云下载里面能找到,我找到了多个版本,一个是采用模板文件方式,带一堆的模板文件,最后被我放弃,因为我的程序带着这么一大堆模板文件不太方便,另外一种库则全部自动生成,不需要模板文件。把编码部分的源代码剥离出来,做个DLL,效果还是比较好的,能够生成BMP文件和BITMAP对象。
4 不管哪个库,最后编码得到的数据结构,都是一个二维数组,数组中的1表示黑点,0表示白点。有的版本提供了将数据转换成图片的功能,有的需要自己绘制成图片。
注意点:
1 在将数据结构形成图像时,要扩展线宽,因为原来的数据只是一个点,把每个点绘制到一个像素上,太小了点,需要放大,每个点需要好几个像素来绘制,这里需要注意。
2 绘制后,确实形成了一个二维码图,可以用手机试试解码。如果解析不出来,可以把屏幕截屏然后粘贴到画图里面,将图片镜像一下,看看是否能解析,如果能解析,需要在生成图片的时候做好数据的倒序处理。如果还不能解析,那就有错了。
3 如果要写入中文,应该用Unicode字符串,然后用WideCharToMultiByte转换成UTF8字符串,然后再编码,肯定可以写入中文的。
4 二维码有冗余功能,因此破坏掉一部分也没问题,手机还能识别,这个时候,就可以在图片中心贴上一个LOGO小图片了,中心的小图片一般是不会影响二维码识别的。当然,这里最好提高二维码的冗余级别设置到第三级。
其他就没什么了,调用也很简单,注意Bmp写入文件的时候,宽度一定要是4的倍数。