C/C++二维码生成库qrencode的使用

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目前用着很好,推荐使用。

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值