EAN13條形碼由13位數字構成,其中第一位爲前置碼,最後一位爲校驗碼。條碼格式以下:
git
從左向右,取奇數位求和乘以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位到第7位(6個數字)爲左側字符。左側字符采用兩種編碼方式:A方式或B方式,編碼表以下:學習
而後根據前置碼(第一位)肯定這6個字符的編碼方式是A仍是B。編碼
前置碼決定的編碼方式以下表:.net
例如:6901234567892的前置碼爲6,查上表,左側6個數據的編碼方式爲ABBBAA。
右側字符從第8個字符起到最後一位。均按照C方式編碼。
2、生成條形碼條形碼只由和白區間表示,空白表示0,黑色表示1,因此先將十進制的數字字符根據編碼表轉化爲二進制的形式,而後在繪製圖像。
這裏十進制轉二進制不是按照運算法則轉化,而是根據EAN-13的編碼表進行轉化。
public byte[] GetCodeChose(int prefix)
輸入:prefix:前置碼
輸出:編碼方式數組
該函數用來根據前置碼獲取編碼方式。
byte[,][] code = new byte[3,10][];
或者寫成定常數組也能夠:
byte[,,,] code = new byte[3,10,7];
第一維存放編碼方式;第二維存放十進制數字符號;第三維存放相應的二進制編碼。
而後利用函數:
public byte[] GetCode(int type,int num)
輸入: type:編碼方式 ;num:十進制數字
輸出:十進制字符的二進制表示。
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。能夠在生成二進制編碼時加上。
爲了保證輸入條碼編號的有效性,這裏作一個簡單的驗證。
簡單點說就是利用黑白色對光的反射程度不一樣,黑色吸取了大部分光波,白色返回大部分光波,因此根據返回的光波強就能夠判斷時掃描到的是黑色仍是白色區域,而後再轉化爲0或者1的數字信號便可。
上述方法是在有硬件條件下的識別方法,對於沒有識別器的時候,咱們能夠藉助條碼(或者二維碼)識別庫zbar(日本的)和zxing(美國的)來進行識別。或者直接根據像素點的值判斷也可。
本次是利用zxing進行識別。
首先在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、截圖