目录
二、改造libqr, 不依赖第三方库,直接在项目中,添加.h .c 就可以生成二维码
调研了几个二维码生成库
GitHub - rsky/qrcode: C library and its language bindings to make a QR Code.
这三个唯一一个不依赖其它库的是 QR-Code-generator, 但缺点也很明显,不支持生成图片 , 纯算法, 不生成图片,当然也不依赖第三方库
其它两个,都支持生成图片
libqr依赖 zlib 、libqrencode依赖的库更多
windows下,用cmake编译很麻烦,必须得有依赖库支持
重点研究的libqr, 发现依赖库主要用在生成png TIFF 图片格式上,如果只生成BMP的话,则不需要额外依赖库,所以重点改造了这个库
实际应用中,我只想在我的项目中,添加二维码生成功能
因此,最好只需要头文件 c文件,就能实现最好,不要额外的lib文件、更不要dll文件
这三个库,重点研究了 libqr, 对其改造,实现了所需功能
libqr,因为支持了png,所以有了依赖项目,而我实际工作中,只需要生成BMP就行了
总的文件如下:
实际用到的如下:
修改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
- #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;
- }
嫌麻烦的话,可打赏10元,奉上我整理的源码测试