VC编译zxing-cpp(一维码或二维码库)

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;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kmblack1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值