1.Zint库的使用手册
https://github.s3.amazonaws.com/downloads/zint/zint/zint_manual_242.pdf
大家没事没人会去看这个文档的,因为是英文的而且都是专业术语,一般人看不懂且也不想去看,我们用zint库也就是用来生个码,可能是二维码,可能是一维码等等。但是呢,我建议你通读一遍,不然很可能在使用zint库的时候常常因为某个参数值问题而停滞。
2.zint库的资源下载
下载zint源码: https://sourceforge.net/p/zint/code/ci/master/tree/
zint库的编译依赖于两个库:zlib和libpng,需要说明的是这两个库是编译才需要,使用时并不需要
下载zlib库源码: http://www.zlib.net
下载libpng库源码: https://sourceforge.net/projects/libpng/
三个文件下载后解压并进行改名:
3.编译zlib/lpng库
lpng1637\projects\vstudio\vstudio.sln打开,我用的是VS2015
编译libpng和zlib:编译成功后你可以得到 libpng16.dll libpng16.lib zlib.lib
如果编译过程中出现找不到文件的错误,请检查文件夹名称是否正确,各个版本的不一样,请参照zlib
在D盘新建一个文件夹opt,并在此目录下新建include,lib两个文件夹,并拷贝文件进来
4.编译zint库
打开:zint-code\win32\zint.sln
libzint增加包含目录:
zint增加附加库目录
zint增加附加依赖库:
在libzint工程下右键,选择添加现有项,选择zint-code\backend目录下所有的.h和.c,然后添加。避免编译出错
如果出现 未定义的标识符 alloc_ ,在出现此问题的*.c文件中增加: #include <malloc.h>
编译:会生成 zintd.dll libzint.lib
5.VC(MFC)使用Zint库生成二维码(支持中文汉字),并生成bmp文件
动态调用方式需要三个文件:zintd.dll libzint.lib zint.h
二维码的设置需要如下几个参数:
scale 放大倍数
option_1 依赖于symbology,不同编码有不同意义
option_2 依赖于symbology,不同编码有不同意义
symbology 编码类型,在手册上有描述,如二维码是58
output_options 有无边框之类的控制
show_hrt 在图片上显示可读信息,如果设置为1,则text必须含有内容。
text 图片上显示的文字信息,配合show_hrt使用。
input_mode 决定编码格式,二进制流,还是ASCII,亦或是UTF8。
#include "zint.h"
#pragma comment(lib, "libzint.lib")
BOOL GenerateBarcode(const char * szText, int len)
{
struct zint_symbol * symbol;
int ret = 0;
if (!szText)
{
return FALSE;
}
TRY
{
symbol = ZBarcode_Create();
if (symbol != NULL)
{
symbol->scale = 2;
symbol->option_1 = 3; //容错级别
symbol->option_2 = 10; //版本,决定图片大小
symbol->symbology = BARCODE_QRCODE;
symbol->output_options = 0;
symbol->show_hrt = 0; //可显示信息,如果设置为1,则需要设置text值
symbol->input_mode = DATA_MODE;
strcpy(symbol->outfile, "TempQr.bmp");
ret = ZBarcode_Encode(symbol, (unsigned char *)szText, len); //编码
if (ret != 0)
{
AfxMessageBox(("ZBarcode_Encode err: %s", symbol->errtxt));
ZBarcode_Delete(symbol);
return FALSE;
}
ret = ZBarcode_Print(symbol, 0); //antate angle 旋转角度
ZBarcode_Delete(symbol);
return TRUE;
}else
{
AfxMessageBox(("ZBarcode_Create err: %s", symbol->errtxt));
return FALSE;
}
}CATCH(CException, e)
{
char szErr[256] = {0};
e->GetErrorMessage(szErr, 255);
AfxMessageBox(("GenerateBarcode exception: %s", szErr));
return FALSE;
}END_CATCH
}
6.专业术语解释
名词解释:
1. Symbol,可以看成是编码之后生成的一张图
2. Symbology,代表一种编码方法。每种条码都有自己的编码标准。
3. Linear,应该是长条状的码,例如条形码。
4. Stacked,包含多个长条状码的码,例如 PDF417
5. Matrix,二维码,包括 QR、Maxicode 等等
6. x-dimension,最小模块的大小,通常是最小模块的宽,因为条码的模块大小有固定的长宽比,通过宽就能计算出长。对于条形码来说,x-dimension 表示一列的宽(像素大小);对于二维码来说,x-dimension 表示一个模块的宽(像素大小)
重要参数:
生成QRCODE时会用到的几个参数:
1、TZintSymbol.symbology 条码类型,本例中使用BARCODE_QRCODE,对应的值为58,更多条码类型参考zint.h头文件中的定义
2、TZintSymbol.option_1 容错级别。对应的值为1、2、3、4 ,也就是LEVEL_L、LEVEL_M、LEVEL_Q、LEVEL_H
3、TZintSymbol.option_2 图像大小,取值范围为1 - 40,数值越大生成的图像越大,有些例子称之为版本version。
4、TZintSymbol.input_mode 输入类型,取值范围0、1、2、3、4,分别表示DATA_MODE、UNICODE_MODE、GS1_MODE、KANJI_MODE、SJIS_MODE;默认值为0,即DATA_MODE。建议处理中文时使用DATA_MODE,并将输入内容编码为UTF8。