一、前言
本文主要讲解一维码生成的相关知识,并提供zint库编译源码(支持Windows和Linux),以及一个简单运用的Demo
二、相关知识
zint是一维码生成库,可以生成code39,code11,code128,ean13等,运用场景如超市扫描枪,书本条形码等。
zint库需依赖于zlib、libpng这两个库,所以一共需编译三个库,依赖关系如下图。
所以编译先后顺序为:zlib、libpng、zint,因为编译涉及很多文件的修改和包含关系等,并且源码不完全兼容,需修改,这里不详述。
①zlib库需要编译的文件如下:
SOURCES += \
libfile/zutil.c \
libfile/uncompr.c \
libfile/trees.c \
libfile/inftrees.c \
libfile/inflate.c \
libfile/inffast.c \
libfile/infback.c \
libfile/gzwrite.c \
libfile/gzread.c \
libfile/gzlib.c \
libfile/gzclose.c \
libfile/deflate.c \
libfile/crc32.c \
libfile/compress.c \
libfile/adler32.c
HEADERS += \
libfile/zutil.h \
libfile/zlib.h \
libfile/zconf.h \
libfile/trees.h \
libfile/inftrees.h \
libfile/inflate.h \
libfile/inffixed.h \
libfile/inffast.h \
libfile/gzguts.h \
libfile/deflate.h \
libfile/crc32.h
②libpng库需要编译的文件如下:
#依赖库,按照你自己的路径改
CONFIG(release, debug|release){
LIBS += -L$$OUT_PWD/../release/ -lzlib
} else: CONFIG(debug, debug|release) {
LIBS += -L$$OUT_PWD/../debug/ -lzlib
}
HEADERS += \
libfile/pngstruct.h \
libfile/pngpriv.h \
libfile/pnginfo.h \
libfile/pngdebug.h \
libfile/pngconf.h \
libfile/png.h \
libfile/pnglibconf.h \
libfile/zlib.h \
libfile/zconf.h
SOURCES += \
libfile/pngwutil.c \
libfile/pngwtran.c \
libfile/pngwrite.c \
libfile/pngwio.c \
libfile/pngtrans.c \
libfile/pngtest.c \
libfile/pngset.c \
libfile/pngrtran.c \
libfile/pngrio.c \
libfile/pngread.c \
libfile/pngpread.c \
libfile/pngmem.c \
libfile/pngget.c \
libfile/pngerror.c \
libfile/png.c \
libfile/example.c \
libfile/pngrutil.c
③zint库需要编译的文件如下:
#依赖库,按照你自己的路径改
CONFIG(release, debug|release){
LIBS += \
-L$$OUT_PWD/../release/ -lzlib \
-L$$OUT_PWD/../release/ -llibpng
} else: CONFIG(debug, debug|release) {
LIBS += \
-L$$OUT_PWD/../debug/ -lzlib \
-L$$OUT_PWD/../debug/ -llibpng
}
HEADERS += \
libfile/png.h \
libfile/zlib.h \
libfile/pngconf.h \
libfile/pnglibconf.h \
libfile/zconf.h \
libfile/zint.h \
libfile/stdint_msvc.h \
libfile/sjis.h \
libfile/rss.h \
libfile/reedsol.h \
libfile/qr.h \
libfile/pdf417.h \
libfile/pcx.h \
libfile/ms_stdint.h \
libfile/maxicode.h \
libfile/large.h \
libfile/hanxin.h \
libfile/gs1.h \
libfile/gridmtx.h \
libfile/gb18030.h \
libfile/gb2312.h \
libfile/font.h \
libfile/eci.h \
libfile/dmatrix.h \
libfile/composite.h \
libfile/common.h \
libfile/code49.h \
libfile/code1.h \
libfile/bmp.h \
libfile/aztec.h
SOURCES += \
libfile/upcean.c \
libfile/telepen.c \
libfile/svg.c \
libfile/rss.c \
libfile/render.c \
libfile/reedsol.c \
libfile/png.c \
libfile/raster.c \
libfile/qr.c \
libfile/ps.c \
libfile/postal.c \
libfile/plessey.c \
libfile/pdf417.c \
libfile/pcx.c \
libfile/medical.c \
libfile/maxicode.c \
libfile/library.c \
libfile/large.c \
libfile/imail.c \
libfile/hanxin.c \
libfile/gs1.c \
libfile/gridmtx.c \
libfile/gif.c \
libfile/eci.c \
libfile/dotcode.c \
libfile/dmatrix.c \
libfile/dllversion.c \
libfile/composite.c \
libfile/common.c \
libfile/code128.c \
libfile/code49.c \
libfile/code16k.c \
libfile/code1.c \
libfile/code.c \
libfile/codablock.c \
libfile/bmp.c \
libfile/aztec.c \
libfile/auspost.c \
libfile/2of5.c
OTHER_FILES += \
libfile/LICENSE
我这里建议整一个工程,按顺序编译zlib、libpng、zint库,我自己写的zint库编译源码也是这么做的(后面有链接下载),要注意各个库的生成和使用路径。
④使用方法
将zint里的zint.h文件拷贝到(需使用zint库的)工程中,在.pro工程文件加入相关库,并把zlib/libpng/zint库放到exe运行目录下。
#路径改你自己的
LIBS += \
-L$$OUT_PWD/./debug/ -lzlib \
-L$$OUT_PWD/./debug/ -llibpng \
-L$$OUT_PWD/./debug/ -lzint \
//加入头文件
HEADERS += zint.h
⑤一维码解析(支持一维码二维码解析)
三、效果展示
四、源码(使用)简析
void MainWindow::on_pushButton_generate_clicked()
{
//保存图片的路径
QString strImagePath = QCoreApplication::applicationDirPath() + "//barcode.png";
if(!ui->lineEdit->text().isEmpty())
{
//设置生成一维码的属性,我这里是CODE128码,可根据需要自行修改
struct zint_symbol * my_symbol = ZBarcode_Create();
my_symbol->symbology=BARCODE_CODE128;
strcpy(my_symbol->outfile, strImagePath.toStdString().c_str());
//完成一维码制作并保存
ZBarcode_Encode(my_symbol,(unsigned char*)ui->lineEdit->text().toStdString().c_str(),0);
ZBarcode_Print(my_symbol,0); //这个0是旋转角度
ZBarcode_Delete(my_symbol);
//在label上显示一维码图片
QImage img;
img.load(strImagePath.toStdString().c_str());
QImage newImg = img.scaled(ui->label->width(),ui->label->height(), Qt::IgnoreAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(newImg));
}
else
{
QMessageBox::information(this, "Warning", "lineEdit is empty!", QMessageBox::Ok);
}
}
五、源码Demo
①zint/zinb/libpng原生开源库(未经处理):
链接:https://pan.baidu.com/s/1QNAi77hMml0_1LXRVp-2BA
提取码:6ewn
②QT zint库编译源码(已处理,工程支持Windous/Linux自编,纯源码)
zint编译源码超链接
③zint库使用案例Demo
链接:https://pan.baidu.com/s/18caWAqaC05-hXuVDitzZXg
提取码:ldvl