2 Star 2 Fork 0

勇敢牛牛 / BCGAR

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

BCGAR

Bar code generation and recognition


【2018-04-17】 补充countries.txt文件

EAN-13条形码的生成与识别

[TOC]

一、EAN-13条形码编码规则

1.条码构成

EAN13条形码由13位数字构成,其中第一位为前置码,最后一位为校验码。条码格式如下:

![](https://i.imgur.com/Oc9dNEX.png)

图1.1 条形码格式

图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;

④ 10-个位数:C=10-8=2。

(2)左侧字符编码原则

从左向右,第2位到第7位(6个数字)为左侧字符。左侧字符采用两种编码方式:A方式或B方式,编码表如下:

![](https://i.imgur.com/Os3SUK5.png)

图1.3 左侧字符编码

然后根据前置码(第一位)确定这6个字符的编码方式是A还是B。

前置码决定的编码方式如下表:

![](https://i.imgur.com/w4rtggw.png)

图1.3 编码方式

例如:6901234567892的前置码为6,查上表,左侧6个数据的编码方式为ABBBAA。

(3)右侧字符编码原则

右侧字符从第8个字符起到最后一位。均按照C方式编码。

二、生成条形码

条形码只由和白区间表示,空白表示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位(校验位自动计算得出,不用输入)
  • 验证输入类型:必须位纯数字,否则抛出异常
  • 验证国家代码:前三位数字代表国家代码,如果不能匹配国家名称,则抛出异常

三、识别条形码

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";

四、源代码

完整项目地址(码云):https://gitee.com/xgpxg/BCGAR

五、截图

![](https://i.imgur.com/9E5eZhH.png)

图5.1 条码生成截图

图5.2 条码生成截图
The MIT License (MIT) Copyright (c) 2017 小钢炮 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Bar code generation and recognition 展开 收起
C#
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C#
1
https://gitee.com/xgpxg/BCGAR.git
git@gitee.com:xgpxg/BCGAR.git
xgpxg
BCGAR
BCGAR
master

搜索帮助