C/C++二维码生成库qrencode的使用和 Cmake的安装

1、在 https://fukuchi.org/works/qrencode/ 下载qrencode库,我下的是qrencode-4.0.2.tar.gz版本。

2、为该库生成vs解决方案,这里用到cmake跨平台编译工具,首先安装cmake,下载windows的cmake安装包,下载地址: https://cmake.org/download/

我下载的是 https://cmake.org/files/v3.12/cmake-3.12.0-rc1-win64-x64.msi 版本

安装cmake-3.12.0-rc1-win64-x64.msi后,设置系统路径:

3、解压qrencode-4.0.2.tar.gz,使用cmd命令打开命令行,进入该目录,使用以下cmake命令来生成解决方案:

cmake . -DGETOPT_INCLUDE_DIR=“库的头文件所在目录” -DGETOPT_LIBRARIES=“库文件所在目录”

注:-D代表定义变量,用法:-D变量名=变量值。

因为该库的示例代码使用了libpng库生成二维码图片,而libpng库又依赖zlib库,所以你需要下载libpng和zlib库,将这两个库的头文件和库文件对应放在以上cmake命令的"库的头文件所在目录"和"库文件所在目录"中。如果你嫌麻烦,可以直接生成bmp格式的图片,就不需要链接这两个库了,见第4点。

4、不链接libpng和zlib,则直接使用命令:cmake . -DGETOPT_INCLUDE_DIR="" -DGETOPT_LIBRARIES=""

虽然也报了找不到png的错误,但不重要,这个时候该目录下已经生成了QRencode.sln解决方案。

为什么cmake命令要定义变量-DGETOPT_INCLUDE_DIR="" 和 -DGETOPT_LIBRARIES=""?

因为不定义GETOPT_INCLUDE_DIR和GETOPT_LIBRARIES会报找不到这两个变量的错误。

5、直接打开QRencode.sln解决方案,其中包含四个项目,其中有用的是,qrencode是静态库工程,编译后生成qrencoded.lib库在Debug/Release目录下,使用该库的接口QRcode_encodeString就可以生成二维码信息了,而qrenc是写怎么使用qrencode的,并且用了png库,我没用,直接编译会报错找不到头文件,因为我没用,所以也没去解决。

6、将二维码信息生成bmp格式的二维码图片,你可以新建工程链接该qrencoded.lib库,调用以下代码生成bmp二维码图片:

void qr_code(std::string _src_str, std::string _dst_bmp_path)
{
//参数_src_str是待编码的字符串,_dst_bmp_path是编成二维码后生成的bmp路径名,比如 ./my_qrcode.bmp
const char* szSourceSring = _src_str.c_str();
unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
unsigned char* pRGBData, pSourceData, pDestData;
QRcode
pQRC;
FILE
f;

if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
{
    unWidth = pQRC->width;
    unWidthAdjusted = unWidth * 8 * 3;
    if (unWidthAdjusted % 4)
        unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
    unDataBytes = unWidthAdjusted * unWidth * 8;
    // Allocate pixels buffer
    if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
    {
        exit(-1);
    }
    // Preset to white
    memset(pRGBData, 0xff, unDataBytes);
    // Prepare bmp headers
    BITMAPFILEHEADER kFileHeader;
    kFileHeader.bfType = 0x4d42;  // "BM"
    kFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + unDataBytes;
    kFileHeader.bfReserved1 = 0;
    kFileHeader.bfReserved2 = 0;
    kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    BITMAPINFOHEADER kInfoHeader;
    kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
    kInfoHeader.biWidth = unWidth * 8;
    kInfoHeader.biHeight = -((int)unWidth * 8);
    kInfoHeader.biPlanes = 1;
    kInfoHeader.biBitCount = 24;
    kInfoHeader.biCompression = BI_RGB;
    kInfoHeader.biSizeImage = 0;
    kInfoHeader.biXPelsPerMeter = 0;
    kInfoHeader.biYPelsPerMeter = 0;
    kInfoHeader.biClrUsed = 0;
    kInfoHeader.biClrImportant = 0;

    // Convert QrCode bits to bmp pixels
    pSourceData = pQRC->data;
    for (y = 0; y < unWidth; y++)
    {
        pDestData = pRGBData + unWidthAdjusted * y * 8;
        for (x = 0; x < unWidth; x++)
        {
            if (*pSourceData & 1)
            {
                for (l = 0; l < 8; l++)
                {
                    for (n = 0; n < 8; n++)

                    {
                         //以下三行是设置三基色,三基色都设置为0x00,则生成的二维码图片就是黑色的了,要什么颜色自己调整
                        *(pDestData + n * 3 + unWidthAdjusted * l) = 0x00;            
                        *(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0x00;
                        *(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0x00;
                    }
                }
            }
            pDestData += 3 * 8;
            pSourceData++;
        }
    }

    // Output the bmp file
    if (!(fopen_s(&f, _dst_bmp_path.c_str(), "wb")))
    {
        fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
        fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
        fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
        printf("qrcode has generated in %s\n", _dst_bmp_path.c_str());
        fclose(f);
    }
    else
    {
        printf("Unable to open file");
        exit(-1);
    }
    // Free data
    free(pRGBData);
    QRcode_free(pQRC);
}
else
{
    printf("NULL returned");
    exit(-1);
}

}
生成位图的代码参考:https://blog.csdn.net/sunnyloves/article/details/53053487

注:起初我使用另一个库(qrcode库)来生成二维码图片(https://github.com/rsky/qrcode),发现待编码的字符串过长时生成的二维码无法被正常解析,于是才换成这个qrencode库,qrencode目前用着很好,推荐使用。

------------------------------------++++++++++++++++++++++++++++++++++++±----------------------------
cmake的安装

环境:Windows 64位

首先下载CMake官网下载地址:https://cmake.org/download/

里面好多版本,根据自己需要版本进行下载。

【注意】选择好自己电脑是什么系统,以及是32位还是64位。(P.S.x86指的是32位系统;x64指的是64位系统)

下载完成后,双击进行安装。

1.欢迎界面。点【next】

2.同意协议。勾选,然后点【next】

3.按图中红框勾选,然后点【next】

4.路径选择,然后点【next】。

安装路径根据自己需要自行修改。【建议】路径名是在英文路径下,不要包含中文和空格

5.开始安装。点【Install】

6.安装过程,请耐心等待

7.安装完成。点【Finish】

8.到此CMake3.8.2安装工作就以完成。 因为在安装过程中选择了自动添加环境,所以安装完后不用手动添加环境了,但是此时必须得重启电脑,变量才能使用,否则无法对Cmake安装进行测试。

重启电脑后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功,如下图:

猜你喜欢

转载自blog.csdn.net/weixin_41454036/article/details/108399481