zint 是一个开源条形码 QR 码生成库和生成工具
一、zint
1. 介绍
Zint是一个软件,允许在任何广泛的公共领域条形码标准中轻松编码数据,并允许将这种功能集成到您自己的程序中。
Zint项目的目标是提供一个完全跨平台的开源条形码生成解决方案,目前包含了:
- 一个基于Qt的基础GUI
- 一个命令行工具
- 一个允许用户调用API使用Zint的库
2. 下载
zint在github的仓库地址为:https://github.com/zint/zint,使用过程中发现github上的版本才到2.4.2,太老了。
zint主要维护的是sourceforge仓库,地址为:https://sourceforge.net/projects/zint/,可以下载到最新的「2.10.0」版本,也可以使用git拉取:
git clone git://git.code.sf.net/p/zint/code zint-code
3. 文档
文档地址为:http://www.zint.org.uk。
二、安装
1. macOS
brew install zint
2. linux(从源码安装)
下载源码:
git clone git://git.code.sf.net/p/zint/code zint-code
提前安装好cmake:
sudo apt-get install cmake
新建编译文件夹:
cd zint
mkdir build
安装:
cd build
cmake ..
make
sudo make install
3. libzint库安装检查
linux默认安装位置:
/usr/local/libzint.so
mac默认安装位置:
/usr/local/lib/libzint.dylib
4. zint工具安装检查
zint -h
三、zint命令行工具的使用
1.输入数据
使用-d
参数输入数据:
zint -d "helloworld"
执行之后在当前目录生成图片out.png:
也可以直接从文件中读取数据:
zint -i ./hello.txt
2. 输出数据
使用-o
参数指定输出文件名:
zint -o hello.png -d "hello world"
3. 选择条形码类型
使用-b
参数指定条形码类型,支持的类型列表可以使用如下列表查看:
zint -t
生成二维码(QRCODE):
zint -b 58 -o hello.png -d "hello world"
生成的二维码图片为42x42:
4. 调整图片大小
图片自身大小
条形码通过--height=<>
参数来调整高度。
二维码通过--vers=<>
参数指定版本来调整大小,版本与大小的对应如下表:
生成版本为4的二维码:
zint -b 58 --vers=4 -d "hello world"
生成的二维码图片为66x66(「默认已经放大1倍了」):
放大
使用-scale=
参数和默认x维的倍数来改变图片大小,默认是1,这里修改为2:
zint -b 58 --vers=4 --scale=2 -d "hello world"
生成的二维码大小为132x132:
四、libzint库
1. 使用方法
使用时需要包含头文件:
#include <zint.h>
编译时需要带上参数-lzint
和动态库路径:
gcc main.c -lzint -Wl,-rpath="/usr/local/lib"
2. 符号类型
symbol结构体中的 symbology 成员表示符号类型。
一维码(BARCODE_CODE128)
单个尺寸的符号通常指条形码,由若干条和若干不同宽度的空白组成。
常用类型是 「Standard Code 128 (ISO 15417)」。这种码支持ASCII全字符,并使用三模系统将数据压缩成较小的符号,是Zint默认使用的符号类型。
二维码(BARCODE_QRCODE)
QRCode全称Quick Reponse COde,由Denso开发。
根据下表设置--secure=<option>
参数或者设置option_1
可以获得四种级别的错误纠正:
符号的大小可以使用--vers=<>
参数或者通过option_2
参数设置需要的二维码版本(1-40),生成的二维码大小如之前的表所示。
3. API
查询当前libzint库版本
函数原型:
int ZBarcode_Version();
使用示例:
printf("libzint version:%dn", ZBarcode_Version());
符号结构体创建/删除
(1) 创建并初始化一个符号结构体
/* Create and initialize a symbol structure */
ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void);
(2) 释放并删除一个符号结构体
/* Create and initialize a symbol structure */
ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void);
生成条形码(默认)
(1) 编码一个条形码:
/* Encode a barcode. If `length` is 0, `source` must be NUL-terminated. */
ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source, int length);
(2) 使用文件中传入的内容编码一个条形码:
/* Encode a barcode using input data from file `filename` */
ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, const char *filename);
输出条形码(输出图片)
/* Output a previously encoded symbol to file `symbol->outfile` */
ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle);
/* Encode and output a symbol to file `symbol->outfile` */
ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, const unsigned char *source, int length,
int rotate_angle);
/* Encode a symbol using input data from file `filename` and output to file `symbol->outfile` */
ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, const char *filename,
int rotate_angle);
输出到缓冲区(位图bitmap)
/* Output a previously encoded symbol to memory as raster (`symbol->bitmap`) */
ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle);
/* Encode and output a symbol to memory as raster (`symbol->bitmap`) */
ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, const unsigned char *source, int length,
int rotate_angle);
/* Encode a symbol using input data from file `filename` and output to memory as raster (`symbol->bitmap`) */
ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, const char *filename,
int rotate_angle);
错误码
/* Warning and error conditions (API return values) */
#define ZINT_WARN_INVALID_OPTION 2 /* Invalid option given but overridden by Zint */
#define ZINT_WARN_USES_ECI 3 /* Automatic ECI inserted by Zint */
#define ZINT_WARN_NONCOMPLIANT 4 /* Symbol created not compliant with standards */
#define ZINT_ERROR 5 /* Warn/error marker, not returned */
#define ZINT_ERROR_TOO_LONG 5 /* Input data wrong length */
#define ZINT_ERROR_INVALID_DATA 6 /* Input data incorrect */
#define ZINT_ERROR_INVALID_CHECK 7 /* Input check digit incorrect */
#define ZINT_ERROR_INVALID_OPTION 8 /* Incorrect option given */
#define ZINT_ERROR_ENCODING_PROBLEM 9 /* Internal error (should not happen) */
#define ZINT_ERROR_FILE_ACCESS 10 /* Error opening output file */
#define ZINT_ERROR_MEMORY 11 /* Memory allocation (malloc) failure */
#define ZINT_ERROR_FILE_WRITE 12 /* Error writing to output file */
#define ZINT_ERROR_USES_ECI 13 /* Error counterpart of warning if WARN_FAIL_ALL set (see below) */
#define ZINT_ERROR_NONCOMPLIANT 14 /* Error counterpart of warning if WARN_FAIL_ALL set */
3. demo
生成条形码
#include <zint.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int ret;
struct zint_symbol *symbol;
printf("libzint version:%dn", ZBarcode_Version());
symbol = ZBarcode_Create();
if (!symbol) {
printf("symbol create fail!(%s)rn", symbol->errtxt);
return -1;
}
ret = ZBarcode_Encode(symbol, argv[1], 0);
if (ret != 0) {
printf("ZBarcode encode fail, ret is %d(%s)rn", ret, symbol->errtxt);
ZBarcode_Delete(symbol);
return -1;
}
ret = ZBarcode_Print(symbol, 0);
if (ret != 0) {
printf("ZBarcode print fail, ret is %d(%s)rn", ret, symbol->errtxt);
ZBarcode_Delete(symbol);
return -1;
}
ZBarcode_Delete(symbol);
printf("ZBarcode delete.rn");
return 0;
}
编译:
gcc main.c -lzint -Wl,-rpath="/usr/local/lib"
运行:
./a.out helloworld
生成的条形码如图:
生成二维码
添加如下设置类型的代码:
symbol->symbology = BARCODE_QRCODE;
或者
symbol->symbology = 58;
默认生成的二维码图片大小是42x42:
生成指定尺寸的二维码
zint命令行工具使用--vers=<>参数设置需要的「二维码版本」(1-40),调用 libzint 库时「设置 option_2 参数」即可:
symbol->option_2 = 4;
再次编译运行,生成的二维码大小为66x66(「默认已经放大1倍了」):
同时,可以设置放大倍数来进一步调整二维码大小,比如这里设置放大倍数为4:
symbol->scale = 4;
重新编译运行,生成的二维码大小为 264x264:
推荐阅读
-
zint 是一个开源条形码 QR 码生成库和生成工具
-
InfoQ,谈谈百度开源高性能搜索引擎 Puck-Ben:Puck是团队长期研究和努力的成果,作为Puck的负责人,我对这个项目有着深深的热爱和执着,对我个人而言,它不仅仅是一个搜索引擎,而是代表着团队心血和智慧的结晶,它是我们对技术的追求,对创新的执着,也是我们对未来的期望和愿景,Puck的每一次升级和优化都记录着我们的成长和进步。这是我们对技术的追求,对创新的执着,也是我们对未来的期望和憧憬,帕克的每一次升级和优化都记录着我们的成长和进步。 我对帕克的未来充满期待。首先,我希望 Puck 能够在开发者社区得到广泛应用,同时得到社区的反馈,不断优化和改进。我期待看到更多的人参与到Puck的开发和使用中来,通过大家的共同努力,让Puck成为人工智能领域有影响力的工具。其次,我希望Puck能够不断创新和优化,保持技术领先地位,不仅要适应当前的技术需求,更要预测和引领未来的技术趋势。最后,我希望Puck能在更多的实际应用中实现自身价值,为人工智能在各行各业的应用提供有力支撑,推动科技发展。 访谈嘉宾简介: Ben,百度搜索内容技术部主任架构师,负责多模态内容理解、超大规模内容关系计算、内容处理与生成、模型优化等方向。 欢迎加入朋克技术交流群:913964818 本部门招聘ANN搜索工程师、模型优化工程师、分布式计算研发工程师等多个职位。欢迎勇于接受挑战、具有优秀分析和解决问题能力的人才加入我们。 招聘邮箱:tianyakun@baidu.com --END-- 推荐阅读
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法