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。