QT zint一维码生成解析

一、前言

本文主要讲解一维码生成的相关知识,并提供zint库编译源码(支持Windows和Linux),以及一个简单运用的Demo

二、相关知识

zint是一维码生成库,可以生成code39,code11,code128,ean13等,运用场景如超市扫描枪,书本条形码等。

zint库需依赖于zlib、libpng这两个库,所以一共需编译三个库,依赖关系如下图。

QT zint一维码生成解析
所以编译先后顺序为: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库编译源码也是这么做的(后面有链接下载),要注意各个库的生成和使用路径。
QT zint一维码生成解析
QT 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

QT zint一维码生成解析
⑤一维码解析(支持一维码二维码解析)

《QT二维码生成和解析&Demo》

三、效果展示

QT zint一维码生成解析

四、源码(使用)简析

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

上一篇:Mybatis学习笔记


下一篇:IDEA下使用Maven搭建MyBatis并实现增删改查