【C#】EAN-13條形碼生成與識別

1、EAN-13條形碼編碼規則

1.條碼構成

EAN13條形碼由13位數字構成,其中第一位爲前置碼,最後一位爲校驗碼。條碼格式以下:
git

Oc9dNEX.png
圖1.1 條形碼格式
TGJ0a8y.png
圖1.2 條形碼區域劃分

2.條碼編碼原則

(1)檢驗碼計算

從左向右,取奇數位求和乘以1(不包含校驗位),偶數位求和乘以3,將以上兩步的結果求和再取和的個位數,最後再用10減這個個位數,就是最後一位校驗碼的值。算法

例如: 690123456789C(c爲校驗位)數組

① 計算奇數位的和:(6+0+2+4+6+8)*1=26;安全

② 計算偶數位的和:(9+1+3+5+7+9)*3=102;網絡

③ 計算和:sum = 26+102=128;ide

④ 10-個位數:C=10-8=2。函數

(2)左側字符編碼原則

從左向右,第2位到第7位(6個數字)爲左側字符。左側字符采用兩種編碼方式:A方式或B方式,編碼表以下:學習

Os3SUK5.png
圖1.3 左側字符編碼

而後根據前置碼(第一位)肯定這6個字符的編碼方式是A仍是B。編碼

前置碼決定的編碼方式以下表:.net

w4rtggw.png
圖1.3 編碼方式

例如:6901234567892的前置碼爲6,查上表,左側6個數據的編碼方式爲ABBBAA。

(3)右側字符編碼原則

右側字符從第8個字符起到最後一位。均按照C方式編碼。

2、生成條形碼

條形碼只由和白區間表示,空白表示0,黑色表示1,因此先將十進制的數字字符根據編碼表轉化爲二進制的形式,而後在繪製圖像。

1.十進制轉二進制

這裏十進制轉二進制不是按照運算法則轉化,而是根據EAN-13的編碼表進行轉化。

(1) 獲取編碼方式

public  byte[] GetCodeChose(int prefix)

輸入:prefix:前置碼

輸出:編碼方式數組

該函數用來根據前置碼獲取編碼方式。

(2)對編碼表進行處理,轉化爲三維數組的形式

byte[,][] code = new byte[3,10][];

或者寫成定常數組也能夠:

byte[,,,] code = new byte[3,10,7];

第一維存放編碼方式;第二維存放十進制數字符號;第三維存放相應的二進制編碼。

而後利用函數:

public byte[] GetCode(int type,int num)

輸入: type:編碼方式 ;num:十進制數字

輸出:十進制字符的二進制表示。

2 繪製條形碼

(1) 根據上一步獲得的二進制數組,0表明黑色,1表明白色,開始繪製圖像。

EAN-13共113個模塊(即113個條紋,包括左右兩側空白區),95個有效字符模塊,而且條碼的每一個模塊(即一個條紋)是等寬的。

因此設置繪製函數以下:

public Image<Gray,byte> DrawCode(string text,string code, int minWidth,int height)

輸入:text:前12個字符;code:二進制編碼;條紋最小寬度;height:生成圖像的高度

輸出:條形碼圖像

其中,爲了繪製起始位、分隔位以及終止位的不一樣長度,將height - margin + height / 15做爲起始位、分隔位以及終止位的長度。

注:起始符爲101;分隔符爲01010;終止符爲101。能夠在生成二進制編碼時加上。

(2) 對輸入的條碼編號進行簡單驗證

爲了保證輸入條碼編號的有效性,這裏作一個簡單的驗證。

  • 驗證輸入長度:輸入長度應爲12位(校驗位自動計算得出,不用輸入)
  • 驗證輸入類型:必須位純數字,不然拋出異常
  • 驗證國家代碼:前三位數字表明國家代碼,若是不能匹配國家名稱,則拋出異常
3、識別條形碼

1.識別方法

簡單點說就是利用黑白色對光的反射程度不一樣,黑色吸取了大部分光波,白色返回大部分光波,因此根據返回的光波強就能夠判斷時掃描到的是黑色仍是白色區域,而後再轉化爲0或者1的數字信號便可。

上述方法是在有硬件條件下的識別方法,對於沒有識別器的時候,咱們能夠藉助條碼(或者二維碼)識別庫zbar(日本的)和zxing(美國的)來進行識別。或者直接根據像素點的值判斷也可。

本次是利用zxing進行識別。

2.zxing.net的使用

首先在NuGet中下載安裝zxing.net,會自動引入zxing.dll。

而後實例化識別器:

BarcodeReader reader = new BarcodeReader();

獲取結果集:

Result result = reader.Decode(bitmap)

獲取識別文本:

string resText = result.Text;

這樣一個簡單的識別就完成了。

還能夠設置字符編碼:

ader.Options.CharacterSet = "UTF-8";
4、源代碼

完整項目地址(碼雲):https://gitee.com/xgpxg/BCGAR

5、截圖

9E5eZhH.png
圖5.1 條碼生成截圖

ElUJ5kZ.png
圖5.2 條碼生成截圖

網絡上志同道合,咱們一塊兒學習網絡安全,一塊兒進步,QQ羣:694839022
相關文章
相關標籤/搜索