一、前言
本文主要介绍如何使用C++来实现二维码的生成,使用到了开源库:qrencode
代码生成结果如下图,完全是可以扫描的:
二、qrencode库的基本使用
如果你目前在使用vcpkg
,那就非常简单了,直接运行以下命令进行安装即可:
.\vcpkg.exe install libqrencode:x64-windows
vcpkg
的使用教程可以参考另一篇文章:C++开源库配置
如果没有使用vcpkg,那么就需要先下载我编译好的库:qrencode
解压后有一个头文件与一个静态库文件(为 x64 Release 版本):
使用方法同样参考文章C++开源库配置的手动配置部分。
如果想要尝试自己编译这个库,可以参考这篇文章:windows 编译qrencode库
然后在代码中使用它也非常简单,基本只需要一个函数:
#include"qrencode.h"
#pragma comment(lib,"qrencode.lib")
int main(){
QRcode* pQRC = QRcode_encodeString("https://www.kucoding.com", 0, QR_ECLEVEL_H, QR_MODE_8, 1);
}
如果使用的vcpkg下载安装,那么直接包含头文件就可以使用了:
#include<qrencode.h>
int main(){
QRcode* pQRC = QRcode_encodeString("https://www.kucoding.com", 0, QR_ECLEVEL_H, QR_MODE_8, 1);
}
即,我们大部分情况只用得到这个库中的QRcode_encodeString
函数,该函数的作用是将字符串编码为符号串并返回,返回的QRcode
对象中就包含了二维码的数据
它有5个参数,但事实上除了第一个参数为我们要进行编码的字符串外,其它参数基本就是固定的:
- 要进行编码的字符串
- 版本,填0即可自动选择
- 纠错级别,基本就填这个值,即高级别即可
- 编码模式,现在一般都是采用的utf-8进行编码,所以这个值也是固定的
- 是否区分大小写,一般也是要区分的,所以基本固定填1
更多详细介绍可以参考官网说明:QRcode_encodeString
编码成功后,它会返回一个QRcode
对象,定义如下:
typedef struct {
int version; ///< 版本
int width; ///< 宽度
unsigned char *data; ///< 生成的数据
} QRcode;
由于二维码是长宽相等的正方形,所以data
的长度为 width*width
后面我们也主要是通过这两个数据来生成我们的二维码
由于他返回的是一个指针,所以使用完后我们还需要调用一个函数来释放内存:
QRcode_free(pQRC);
这里注意一下上面这个data
返回的数据格式,其含义是按照位来划分的,一个字节(char)有8位
每一位的含义如下(来源于官网):
MSB 76543210 LSB
|||||||`- 1=black/0=white
||||||`-- 1=ecc/0=data code area
|||||`--- format information
||||`---- version information
|||`----- timing pattern
||`------ alignment pattern
|`------- finder pattern and separator
`-------- non-data modules (format, timing, etc.)
但事实上,除了第0位,其它位一般我们都用不上,只要第0位为1,就说明该位置应该为黑色,为0则为白色
一般二维码都为黑白色,但后面自己生成二维码图片时,其实是可以更改生成的二维码颜色的