Zint 庫:Zint庫的編譯及使用(二維碼QrCode生碼),MFC/VC使用實例

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章