一個開源的條碼二維碼生成庫和生成工具
一、zint
1. 介紹
Zint是一個軟件,允許在任何廣泛的公共領(lǐng)域條形碼標(biāo)準(zhǔn)中輕松編碼數(shù)據(jù),并允許將這種功能集成到您自己的程序中。Zint項目的目標(biāo)是提供一個完全跨平臺的開源條形碼生成解決方案,目前包含了:- 一個基于Qt的基礎(chǔ)GUI
- 一個命令行工具
- 一個允許用戶調(diào)用API使用Zint的庫
2. 下載
zint在github的倉庫地址為:https://github.com/zint/zint,使用過程中發(fā)現(xiàn)github上的版本才到2.4.2,太老了。zint主要維護(hù)的是sourceforge倉庫,地址為:https://sourceforge.net/projects/zint/,可以下載到最新的「2.10.0」版本,也可以使用git拉?。?/p>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默認(rèn)安裝位置:/usr/local/libzint.so
mac默認(rèn)安裝位置:/usr/local/lib/libzint.dylib
4. zint工具安裝檢查
zint?-h
三、zint命令行工具的使用
1.輸入數(shù)據(jù)
使用-d
參數(shù)輸入數(shù)據(jù):zint?-d?"helloworld"
執(zhí)行之后在當(dāng)前目錄生成圖片out.png:也可以直接從文件中讀取數(shù)據(jù):zint?-i?./hello.txt
2. 輸出數(shù)據(jù)
使用-o
參數(shù)指定輸出文件名:zint?-o?hello.png?-d?"hello?world"
3. 選擇條形碼類型
使用-b
參數(shù)指定條形碼類型,支持的類型列表可以使用如下列表查看:zint?-t
生成二維碼(QRCODE):zint?-b?58?-o?hello.png?-d?"hello?world"
生成的二維碼圖片為42x42:4. 調(diào)整圖片大小
圖片自身大小
條形碼通過--height=<>
參數(shù)來調(diào)整高度。二維碼通過--vers=<>
參數(shù)指定版本來調(diào)整大小,版本與大小的對應(yīng)如下表:生成版本為4的二維碼:zint?-b?58?--vers=4?-d?"hello?world"
生成的二維碼圖片為66x66(「默認(rèn)已經(jīng)放大1倍了」):放大
使用-scale=
參數(shù)和默認(rèn)x維的倍數(shù)來改變圖片大小,默認(rèn)是1,這里修改為2:zint?-b?58?--vers=4?--scale=2?-d?"hello?world"
生成的二維碼大小為132x132:四、libzint庫
1. 使用方法
使用時需要包含頭文件:#include?
編譯時需要帶上參數(shù)-lzint
和動態(tài)庫路徑:gcc?main.c?-lzint?-Wl,-rpath="/usr/local/lib"
2. 符號類型
symbol結(jié)構(gòu)體中的 ?symbology 成員表示符號類型。一維碼(BARCODE_CODE128)
單個尺寸的符號通常指條形碼,由若干條和若干不同寬度的空白組成。常用類型是 「Standard Code 128 (ISO 15417)」。這種碼支持ASCII全字符,并使用三模系統(tǒng)將數(shù)據(jù)壓縮成較小的符號,是Zint默認(rèn)使用的符號類型。二維碼(BARCODE_QRCODE)
QRCode全稱Quick Reponse COde,由Denso開發(fā)。根據(jù)下表設(shè)置--secure=
參數(shù)或者設(shè)置option_1
可以獲得四種級別的錯誤糾正:符號的大小可以使用--vers=<>
參數(shù)或者通過option_2
參數(shù)設(shè)置需要的二維碼版本(1-40),生成的二維碼大小如之前的表所示。3. API
查詢當(dāng)前l(fā)ibzint庫版本
函數(shù)原型:int?ZBarcode_Version();
使用示例:printf("libzint?version:%d\n",?ZBarcode_Version());
符號結(jié)構(gòu)體創(chuàng)建/刪除
(1) 創(chuàng)建并初始化一個符號結(jié)構(gòu)體?/*?Create?and?initialize?a?symbol?structure?*/
ZINT_EXTERN?struct?zint_symbol?*ZBarcode_Create(void);
(2) 釋放并刪除一個符號結(jié)構(gòu)體/*?Create?and?initialize?a?symbol?structure?*/
ZINT_EXTERN?struct?zint_symbol?*ZBarcode_Create(void);
生成條形碼(默認(rèn))
(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) 使用文件中傳入的內(nèi)容編碼一個條形碼:/*?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);
輸出到緩沖區(qū)(位圖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?
#include?
int?main(int?argc,?char?*argv[])
{
????int?ret;
????struct?zint_symbol?*symbol;
????printf("libzint?version:%d\n",?ZBarcode_Version());
????symbol?=?ZBarcode_Create();
????if?(!symbol)?{
????????printf("symbol?create?fail!(%s)\r\n",?symbol->errtxt);
????????return?-1;
????}
????ret?=?ZBarcode_Encode(symbol,?argv[1],?0);
????if?(ret?!=?0)?{
????????printf("ZBarcode?encode?fail,?ret?is?%d(%s)\r\n",?ret,?symbol->errtxt);
????????ZBarcode_Delete(symbol);
????????return?-1;
????}
????ret?=?ZBarcode_Print(symbol,?0);
????if?(ret?!=?0)?{
????????printf("ZBarcode?print?fail,?ret?is?%d(%s)\r\n",?ret,?symbol->errtxt);
????????ZBarcode_Delete(symbol);
????????return?-1;
????}
????ZBarcode_Delete(symbol);
????printf("ZBarcode?delete.\r\n");
????return?0;
}
編譯:gcc?main.c?-lzint?-Wl,-rpath="/usr/local/lib"
運行:./a.out?helloworld
生成的條形碼如圖:生成二維碼
添加如下設(shè)置類型的代碼:symbol->symbology?=?BARCODE_QRCODE;
或者symbol->symbology?=?58;
默認(rèn)生成的二維碼圖片大小是42x42:生成指定尺寸的二維碼
zint命令行工具使用--vers=<>參數(shù)設(shè)置需要的「二維碼版本」(1-40),調(diào)用 libzint 庫時「設(shè)置 option_2 參數(shù)」即可:symbol->option_2??=?4;
再次編譯運行,生成的二維碼大小為66x66(「默認(rèn)已經(jīng)放大1倍了」):同時,可以設(shè)置放大倍數(shù)來進(jìn)一步調(diào)整二維碼大小,比如這里設(shè)置放大倍數(shù)為4:symbol->scale?=?4;
重新編譯運行,生成的二維碼大小為 264x264:往期推薦:國產(chǎn)芯片替代STM32的一些經(jīng)驗分享深入理解嵌入式中重要的編程模型
點擊閱讀原文,查看更多分享