一起学习二维码(一)生成自己的二维码
小白最近需要做一个和二维码相关的项目,因此近期小白会陆陆续续的为大家带来一些和二维码相关的分享。
关于二维码的背景,相信很多小伙伴都比较了解了,即使不是很清楚,也每天都在使用二维码,因此这里小白就先不讲“绪论”和“引言”了,直接切入主题了。
小白需要将项目中的部分信息融入到二维码中,之后再进行解码,因此首先第一步就是如何生成指定信息的二维码。这部分其实比较容易,因为网上有很多在线的二维码生成软件,直接输入就可以,效果有时会比自己生成的更加理想。但是为了项目的整体性,因此,还是有必要自己写一个程序能够生成自己想要的二维码。
经过缜密的考虑(谁知道缜密不缜密,反正最后做了这个决定)决定使用QR二维码。小白决定使用libqr库来实现自己生成二维码。选好开源库,接下来就开始安装吧。
这里特别说明,小白使用的是window10+Visual Studio 2013环境
小白也是参考网上的教程进行安装,程序比较复杂,小白重新梳理了一遍。
下 载 源 码
这里需要下载两个安装包,一个是libqr库的源码,另一个是其依赖库zlib。由于后续的操作比较复杂,小白这里建议将两个文件单独放在一个文件夹下。
对于libqr可以通过github进行下载:https://github.com/rsky/qrcode
Zlib库需要用源码进行编译,也可以使用已经编译好的库。小白建议直接使用编译好的库即可,这样可以避免在编译库的时候出现问题。
已编译好的库下载地址:https://pan.baidu.com/s/1nuErVtv (小白亲测这里面的zlib库是可以使用)
下载好后我们需要进行一点点小小的改动,进入libqr文件夹下,找到CMakeList.txt文件夹,修改对zlib引用的目录。将源文件的22-24行注释掉,在原处增加以下内容:
#find_package(ZLIB)
#set my own zlib path
set (ZLIB_INCLUDE_DIRS "") #set in visual studio
set (ZLIB_LIBRARIES "") #set in visual studio
#add_definitions(-Wall -Wextra)
# Set default compile flags for GCC
if(CMAKE_COMPILER_IS_GNUCXX)
message(STATUS "GCC detected, adding compile flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98 -pedantic -Wall -Wextra")
endif(CMAKE_COMPILER_IS_GNUCXX)
安 装 libqr 库
上面的工作完成啦,之后要进行安装,不过由于需要用到cmake进行编译,因此我们这里还得下载cmake。具体网址如下:
64位: https://cmake.org/files/v3.9/cmake-3.9.1-win64-x64.msi
32位: https://cmake.org/files/v3.9/cmake-3.9.1-win32-x86.msi
根据自己的系统选择不同的版本,之后进行安装,在安装选择变量环境的时候直接选择最下面的一项(由于小白已经安装了,无法再次安装,不能给小伙伴放图了)。安装成功后去看看有没有正确安装,有没有加入环境变量里。按“win+R”,之后输入“cmd”,会出现如下界面:
输入“cmake”,出现如下界面表示正确安装,如果没有出现如下界面,建议小伙伴重新安装时重新配置环境变量,或者百度一下如何添加环境变量。
安装好后就开始编译,首先进入qrcode的libqr目录下,执行”cmake .”,这个命令的意思是编译刚才我们修改后的CMakeList.txt文件。,之后相同目录下生成VS的项目文件,如下:
配 置 环 境
之后配置动态库和VS项目的环境。打开libqr_shared.vcxproj,打开后,我们会看到如下的界面。
右键进入属性界面,按照如下步骤进行操作(这里小白说明一下,由于小白已经配置成功,且配置过程个人觉得比较麻烦,为了节省时间,本文的配置环境直接引用参考文章内容,侵删)
设置预处理 QR_DLL_BUILD (如果是编译静态库项目libqr_static则设置为 QR_STATIC_BUILD)
之后设置我们下载的zlib库文件和lib目录,这里,我们将文件夹下的include复制到qrcode文件夹下,将Release(或者Debug)复制到qrcode里面的lib文件夹下(没有自己创建)。之后进行如下操作:
之后进行编译即可。
在编译过程中可能会出现一些报错,例如:
编译时可能会提示 error LNK2019: 无法解析的外部符号 _snprintf 错误,我们替换所有snprintf为_snprintf,vsnprintf为_vsnprintf就可以了
有的小伙伴可能会出现无法找到或者打开m.lib文件的情况,我们直接将附加依赖项中的m.lib删除就可以了。
生 成 二 维 码
所有的配置都大功告成,接下来开始写程序生成我们需要的内容,程序具体如下:
#include <stdio.h>
#include <fstream>
#include "qr.h"
using namespace std;
int main()
{
int errcode = QR_ERR_NONE;
//qrInit的5个参数分别是version,mode,纠错等级和掩码,使用过程中使用除了QR_EM_8BIT以外的mode会生成不正常的二维码,暂时不知道原因。
QRCode* p = qrInit(10, QR_EM_8BIT, 2, -1, &errcode);
if (p == NULL)
{
printf("error\n");
return -1;
}
//下面进入程序最重要的部分
//下面进入程序最重要的部分
//下面进入程序最重要的部分
string strData = "快来关注“小白学视觉吧”";//这句话是重点哦
//最重要的部分结束
//最重要的部分结束
//最重要的部分结束
qrAddData(p, (const qr_byte_t*)strData.data(), strData.length());
//注意需要调用qrFinalize函数
if (!qrFinalize(p))
{
printf("finalize error\n");
return -1;
}
int size = 0;
//两个5分别表示:像素之间的距离和二维码图片的放大倍数,范围都是1-16
qr_byte_t * buffer = qrSymbolToBMP(p, 5, 5, &size);
if (buffer == NULL)
{
printf("error %s", qrGetErrorInfo(p));
return -1;
}
ofstream f("qrcode.bmp");
f.write((const char *)buffer, size);
f.close();
return 0;
}
编译通过,没有任何问题,运行,报错,没有找到zbar.dll。我们需要进行最后一步操作,将zbar.dll和qr.dll放到程序源码所在的文件夹内就可以成功编译了。图如下:
运行后生成我们想要的二维码,小伙伴可以拿出手机扫描一下,验证一下是否是我们输入的内容。
后续小白还要对这个二维码进行修改,中间加上图片,以及对二维码通过程序解码,相关的内容小白会陆续的和小伙伴们分享。
小白在安装的时候主要参考以下博客:
https://blog.csdn.net/qq_35583007/article/details/78874524