zxing-cpp是用于生成或识别一维码或二维码的C++库,它和原版的zxing(java)在使用上区别不大.下载zxing-cpp.
将下载的zxing-cpp-master.zip解压至目录.
最新的zxing只支持C++17标准,因此只能使用Visual Studio 2017或更高版本的Visual Studio 2019编译.
下载最新版的cmake
zxing依赖QT5库,因此在编译前先下载安装QT5,注意截止发稿时间只能下载QT5版本.
#cd至解压目录
mkdir build
cd build
#下面这一步时间比较慢长,请耐心等待
cmake -G "Visual Studio 16 2019" -A "x64" -DQt5_DIR="C:\Qt\Qt5.14.2\5.14.2\msvc2017_64\lib\cmake\Qt5" ..
#-A的值在Windows上一般为Win32/x64/ARM"
#-D用于在临时CMakeCache.txt中使用-D指示的值
经过漫长的等待,终于可以用Visual Studio编译了.用Visual Studio 2019打开项目后,在编译前需要先设置C++语言标准,至少为ISO C++17标准.如下图:
nothings/stb
使用zxing生成条码后,如果需要存储为图片则需要使用nothings/stb,这个就比较简单了,它的所有源码都写在.h文件中,使用到那一部份功能只需要把相应的源码复制到项目中即可.
nothings/stb下载
一个生成条形码的简单例子
#include <stdlib.h>
#include <BarcodeFormat.h>
#include <BitMatrix.h>
#include <ByteMatrix.h>
#include <MultiFormatWriter.h>
#include <TextUtfEncoding.h>
#include <ZXStrConvWorkaround.h>
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
#ifndef SE_OK
#define SE_OK ((int32_t)0)
#endif
#ifndef SE_FAIL
#define SE_FAIL ((int32_t)1)
#endif
#if defined(_MSC_VER)
# define SE_int642str(buf,len,val) _snprintf_s((buf),(len),"%I64d", (val));
# define SE_uint642str(buf,len,val) _snprintf_s((buf),(len),"%I64u", (val));
# define SE_str2int64(str,val) sscanf_s((str),"%I64d", (val));
# define SE_str2uint64(str,val) sscanf_s((str),"%I64u", (val));
# define SE_str2double(str,val) sscanf_s((str),"%Lf", (val));
#else
# ifdef __x86_64__
# define SE_int642str(buf,len,val) snprintf((buf),(len),"%ld", (val));
# define SE_uint642str(buf,len,val) snprintf((buf),(len),"%lu", (val));
# define SE_str2int64(str,val) sscanf((str), "%ld", (val));
# define SE_str2uint64(str,val) sscanf((str), "%lu", (val));
# elif __i386__
# define SE_int642str(buf,len,val) snprintf((buf),(len),"%lld", (val));
# define SE_uint642str(buf,len,val) snprintf((buf),(len),"%llu", (val));
# define SE_str2int64(str,val) sscanf((str), "%lld", (val));
# define SE_str2uint64(str,val) sscanf((str), "%llu", (val));
# endif
# define SE_str2double(str,val) sscanf((str),"%Lf", (val));
#endif
int32_t barcode(int64_t barcode) {
static char szBuf[65];
int width = 150, height = 36, success = 0;
int margin = 10;
int eccLevel = 8;//[0-8]
BarcodeFormat format = BarcodeFormat::CODE_128;
const char *pngfile="D:\\test.png";
SE_int642str(szBuf, 64, barcode);
auto writer = MultiFormatWriter(format).setMargin(margin).setEccLevel(eccLevel);
auto bitmap = ToMatrix<uint8_t>(writer.encode(TextUtfEncoding::FromUtf8(szBuf), width, height));
success = stbi_write_png(pngfile, bitmap.width(), bitmap.height(), 1, bitmap.data(), 0);
if (!success) {
fprint(stderr,"Failed to write image: %s",pngfile);
return SE_FAIL;
}
return SE_OK;
}