目录

一、调研的几个二维码生成库

1、libqr

2、QR-Code-generator

3、libqrencode

4、优缺点如下:

二、改造libqr, 不依赖第三方库,直接在项目中,添加.h  .c  就可以生成二维码

1、实际用到的文件

2、去除lib生成,便于移植

3、建立个控制台项目,移植测试

1)、添加所需文件

2)、测试代码

3)生成效果


一、调研的几个二维码生成库

调研了几个二维码生成库

1、libqr

GitHub - rsky/qrcode: C library and its language bindings to make a QR Code.

2、QR-Code-generator

GitHub - nayuki/QR-Code-generator: High-quality QR Code generator library in Java, TypeScript/JavaScript, Python, Rust, C++, C.

3、libqrencode

libqrencode

4、优缺点如下:

这三个唯一一个不依赖其它库的是 QR-Code-generator, 但缺点也很明显,不支持生成图片  , 纯算法, 不生成图片,当然也不依赖第三方库

其它两个,都支持生成图片

libqr依赖 zlib   、libqrencode依赖的库更多

windows下,用cmake编译很麻烦,必须得有依赖库支持

重点研究的libqr,  发现依赖库主要用在生成png TIFF 图片格式上,如果只生成BMP的话,则不需要额外依赖库,所以重点改造了这个库

二、改造libqr, 不依赖第三方库,直接在项目中,添加.h  .c  就可以生成二维码

实际应用中,我只想在我的项目中,添加二维码生成功能

因此,最好只需要头文件 c文件,就能实现最好,不要额外的lib文件、更不要dll文件

这三个库,重点研究了 libqr, 对其改造,实现了所需功能

libqr,因为支持了png,所以有了依赖项目,而我实际工作中,只需要生成BMP就行了

1、实际用到的文件

总的文件如下:

 

实际用到的如下:

 

2、去除lib生成,便于移植

修改dll宏

qr.h中,将宏定义置空

原来:

#if defined(WIN32) && !defined(QR_STATIC_BUILD)
#ifdef QR_DLL_BUILD
#define QR_API __declspec(dllexport)
#else
#define QR_API __declspec(dllimport)
#endif
#else
#define QR_API
#endif

 

去掉dll宏定义后

#if defined(WIN32) && !defined(QR_STATIC_BUILD)
//#ifdef QR_DLL_BUILD
//#define QR_API __declspec(dllexport)
//#else
//#define QR_API __declspec(dllimport)

#ifdef QR_DLL_BUILD
#define QR_API 
#else
#define QR_API 

3、建立个控制台项目,移植测试

1)、添加所需文件

 

2)、测试代码

#include "libqr/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 = "https://www.gudianxiaoshuo.com";
    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("a.bmp");
    f.write((const char*)buffer, size);
    f.close();
    return 0;
}

3)生成效果

嫌麻烦的话,可打赏10元,奉上我整理的源码测试

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐