C语言编写条形码识别

C语言编写条形码识别,第1张

使用C语言做条形码可以按照以下流程:

1 查找条肢巧逗形码生成规则,或者直接找C语历卖言的开源代码,制作封装字符串转条形码的接口函数;

2 读入要转换的数据;

3 将要转换的数据,通过1中的函数接口,转为图形点阵值。由于条形码只有黑白两色,所以这里可以用0,1两种值用矩阵表示;

4 根据编译器,启动图形界面,初始化图形区域;

5 在图形区域的空间内,按照0 1值,在对应点上上色,其中0上白宽岁色,1上黑色。

至此,条形码显示成功。

一、条形码的读取

用过键盘口式的扫条码罩前耐工具的朋友就知道,它就如同在键盘上按下数字键一样,基本不需任何编程和处理。但如果你使用的是其它接口的话,可能你就要为该设备编写通讯代码了。以下有一段简单的25针串口的条码读取器通讯代码。

Option Explicit

Dim sData As String

Private Sub Form_Load()

With MSComm1

.CommPort = 3 '设为COM3,试运行物春的系统而定,你可提供一个Combox让用户选择。

.PortOpen = True '打开通讯端口

End With

End Sub

Private Sub MSComm1_OnComm()

Dim EndPos As Integer

Select Case MSComm1.CommEvent

Case comEvReceive '当有数据传送过来时

sData = sData &Trim(MSComm1.Input)

'检索回车,通常读卡机每组数据结尾都返回一个回车作为结束符

EndPos = InStr(1, sData, Chr(13))

If EndPos = 0 Then '如果未结束就继续努力

Else '读完一组。

lblBarCode.Caption = sData '显示一组条形码

With lstBarCode

.AddItem Mid(sData, 1, EndPos - 1) '添加一组条形码到列表

End With

sData = "" '清空

End If

End Select

End Sub

Private Sub cmdEnd_Click()

MSComm1.PortOpen = False '关闭端口

End

End Sub

二、条形码的生成

看完以上关于条码读取的代码是否觉得很容易呢?对,在VB上编程本来就不难。以下关于条形码生成的代码也是很容易理解,只需使用一个OFFICE的附带的BarCode控件就可以轻松打印出11种不同标准的条形码,足以满足我们的要求。想起我书架上的一本书中的一篇用Turbo C编写条形码打印程序文章,长篇大论,那时不知看了n天,打了n小时字结果也不尽人意,现在真是幸福多了:)。废话说完,得回归正题。且看条形码生成的代码及有关说明。

源代码主要由两个窗体(frmMain主窗体和frmOption条码设置窗体)和两个模块组成(modGetScreen.bas、SysDLG32.bas)。考虑到篇幅,这里只列出部分较为关键的代码。

新建一个标准工程,添加一个名为(Microsoft Access BarCode Control9)的条形码部件,并添加一个条码控件到窗口,并将窗口改名为frmMain,如图所示。由于控件比较多,这里不便细说,详细内容请看源代码。

模块modGetScreen.bas代码如下:

Option Explicit

'声明BitBlt、GetDesktopWindow、GetWindowDC、ReleaseDC这几个API函数略

Public RegUser As Boolean

Sub GetObjImage1(Obj As Object, OwnerForm As PictureBox, Picture1 As PictureBox)

'hDC

Dim hWndDesk As Long

Dim hDCDesk As Long

'区域表达变量悔唤

Dim x As Long

Dim y As Long

Dim w As Long

Dim h As Long

x = Obj.Left Screen.TwipsPerPixelX

y = Obj.Top Screen.TwipsPerPixelY

w = Obj.Width Screen.TwipsPerPixelX

h = Obj.Height Screen.TwipsPerPixelY

hDCDesk = OwnerForm.hdc

'取出图像

Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCDesk, x, y, vbSrcCopy)

Call ReleaseDC(hWndDesk, hDCDesk)

End Sub

主窗体frmMain.frm部分代码如下:

Private Sub cmdPrint_Click()

'生成条形码图像

Dim r As Long, i As Integer, t As String,cfile As String '临时变量

t = BarCode

For i = 0 To Val(Times) - 1

BarCode1.Value = BarCode + i

DoEvents

Picture1.Refresh

GetObjImage1 BarCode1, Conel, Picture1

If RegUser = False Then '如果未注册添加MASK标记

Picture1.PaintPicture Picture2.Picture, 300, 300

End If

If Dir(SavePath, vbDirectory) = "" Then MkDir SavePath

SavePath = SavePath &IIf(Right(SavePath, 1) <>"", "", "")

cfile = SavePath &BarCode1.Value &".bmp"

SavePicture Picture1.Image, cfile '将条形码保存为图像文件以便打印

Next

BarCode = t

End Sub

条形码设置窗体frmOption.frm代码如下:

Option Explicit

'条形码设置模块

Private Sub cboBig_Click()

BarCode1.Style = cboBig.ListIndex '改变标准

End Sub

Private Sub cboDirection_Click()

BarCode1.Direction = cboDirection.ListIndex '改变方向

End Sub

Private Sub cboLine_Click()

BarCode1.LineWeight = cboLine.ListIndex '改变线宽

End Sub

Private Sub cboSmall_Click()

BarCode1.SubStyle = cboSmall.ListIndex '改变样式

End Sub

Private Sub Check1_Click()

BarCode1.ShowData = Check1.Value '是否显示数据

End Sub

Private Sub cmdChange_Click()

'设置长、宽大小

BarWidth = BarCode1.Height

BarHeight = BarCode1.Width

cmdRefresh_Click

End Sub

Private Sub cmdOK_Click()

'传送条形码设定到主界面

With frmMain.BarCode1

.LineWeight = BarCode1.LineWeight

.Style = BarCode1.Style

.SubStyle = BarCode1.SubStyle

.Direction = BarCode1.Direction

.Width = BarCode1.Width

.Height = BarCode1.Height

.ShowData = BarCode1.ShowData

Me.Hide

End With

With frmMain

.Picture1.Width = .BarCode1.Width

.Picture1.Height = .BarCode1.Height

.Conel.Width = .BarCode1.Width

.Conel.Height = .BarCode1.Height

End With

End Sub

Private Sub cmdRefresh_Click()

BarCode1.Width = BarWidth

BarCode1.Height = BarHeight

End Sub

Private Sub Form_Load()

LoadBarInfo

BarWidth = BarCode1.Width

BarHeight = BarCode1.Height

End Sub

Sub LoadBarInfo() '初始化选项

LoadBigClass cboBig

LoadSmallClass cboSmall

LoadLineSize cboLine

LoadDirection cboDirection

End Sub

Sub LoadBigClass(cbo As ComboBox) '条码标准

With cbo

.AddItem "UPC-A"

.AddItem "UPC-E"

.AddItem "EAN-13"

.AddItem "EAN-8"

.AddItem "Case Code"

.AddItem "Codabar (NW-T)"

.AddItem "Code-39"

.AddItem "Code-128"

.AddItem "U.S. Postnet"

.AddItem "U.S. Postal FIM"

.AddItem "JP Post"

.ListIndex = 2

End With

End Sub

Sub LoadSmallClass(cbo As ComboBox) '条码样式

With cbo

.AddItem "Standard"

.AddItem "2-Digit Supplement"

.AddItem "5-Digit Supplement"

.AddItem "POS Case Code"

.ListIndex = 0

End With

End Sub

许多人在编写数据库应用程序时,都想要加上条形码功能加强工作效率,尤其是销售管理,图书馆管理这类流量大的应用软件,但由于条形码技术难以掌握、标谁又多以及过去的技术种种原因,使得许多人望而却步。本文介绍的一套简单实用的条形码解决方法,希望能帮助各位完善软件系统的功能。文章源代码可以发信到[email protected]索取。

条形码只是一种编码方式,与编程语言无关,使用任意编程工具都可以空搭实现。

条形码的识别原理

由于不同颜色的物体,其反射的可见光的波长不同,白色物体能反射各种波长的可见光,黑色物体则吸收各种波长的可见光,所以当条形码扫描器光源发出的光经光阑及凸透镜1后,照射到黑白相间的条形码上时,反射光经凸透镜2聚焦后,照射到光电转换器上,于是光电转换器接收到与白条和黑条相应的强弱不同的反射光信号,并转换成相应的电信号输出到放大整形电路.白条、黑条的宽度不同,相应的电信号持续时间长短也不同.但是,由光电转换器输出的与条形码的条和空相应的电信号一般仅10mV左右,不能直接使用,因而先要将光电转换器输出的电信号送放大器放大.放大后的电信号仍然是一个模拟电信号,为了避免由条形码中的疵点和污点导致错误信号,在放大电路后需加一整形电路,把模拟信号转换成数字电信号,以便计算机系统能准确判读.整形电路的脉冲数字信号经译码器译成数字、字符信息.它通过识别起始、终止字符来判别出条形码符号的码制及扫描方向;通过测量脉冲数字电信号0、1的数目来判别出条和空的数目.通过测量0、1信号持续的时间来判别条和空的宽度.这样便得到了被辩读的条形码符号的条和空的数目及相应的宽度和所用码制,根据码制所对应的编码规则,便可将条形符号换成相应的数字、字符信息,通过接口电路送给计算机系统进行数据处理与管理,便完成了条形码辨读的全过程.

编码规则

唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码。根据产品的不同性质,如:重量、包装、规格、气味、颜色、形状等等,赋予不同的商品代码。 永久性:产品代码一经分配,就不再更改,并且是终身的。当此种产品不再生产时,其对应的产品代码只能搁置起来,不得重复起用再分配给其它的商品。 无含义:为了保证代码有足够的容量以适应产品频繁的更新换代的需要,最好采用无含义的顺序码。

条形码的码制区别

UPC:(统一产品代码) 只能表示数字 有A、B、C、D、E四个版本 版本 A - 12 位数字 版本 E - 7 位数字 最后一位为校验位 大小是宽1.5" 高1 " ,而且背景要与清晰 主要使用于美国和加W拿大地区,用于工业、医药、仓库等部门

当UPC 作为十二位进行解码时,定义如下: 第一位 = 数字标识 (已经由UCC(统一代码委员会)所建立). 第2-6位 = 生产厂家的标识号(包括第一位) 第7-11 = 唯一的厂家产品代码 第12位 = 校验位(used for error detection)

Code 3 of 9 : 能表示字母、数字和其它一些符号共43个字符:A -Z,0 - 9,-.$/+%,pace 条形码的长度是可变化的 通常用“*”号作为起始、终止符 校验码不用 代码密度介于3 - 9.4个字符/每英寸 空白区是窄条的10倍 用于工业、图书、以及票证自动化管理上

Code 128: 表示高密度数据, 字符串 字符串可变长 符号内含校验码 有三种不同版本: A, B, and C 可用128个字符分别在 A, B, or C 三个字符串集合中 用于工业、仓库、零售批发

Interleaved 2-of-5 (I2 of 5): 只能表示数字0 -9 可变长度 连续性条形码,所有条与空都表示代码,第一个数字由条开始,第二个数字由空组成 空白区比窄条宽10倍 应用于商品批发、仓库、机场、生产/包装识别、工业中 条形码的识读率高,可适用于固定扫描器可靠扫描 在所有一维条形码中的密度最高

Codabar(库德巴条形码): 可表示数字0 - 9,字符$、+、 -、还有只能用作起始/终止符的a, b, c d四个字符

可变长度 没有校验位 应用于物料管理、图书馆、血站和当前的机场包裹发送中 空白区比窄条宽10倍 非连续性条形码,每个字符表示为4条3空

PDF417 (二维码): 多衫举行组成的条形码 不需要连接一个数据库,本身可存储大量数据 应用于:医院、驾或亏碧驶证、物料管理、货物运输 当条形码受一定破坏时,错误纠正能使条形码能正确解码 PDF417, 是Symbol科技公司于1990研制产品。它是一个多行、连续性、可变长、包含大量数据的符号标识。每个条形码有3 - 90行,每一行有一个起始部分、数据部分、终止部分。它的字符集包括所有128个字符,最大数据含量是1850个字符。

一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准。

一维条形码的应用可以提高信息录入的速度,减少差错率,但是一维条形码也存在一些不足之处:

* 数据容量较小: 30个字符左右

* 只能包含字母和数字

* 条形码尺寸相对较大(空间利用率较低)

* 条形码遭到损坏后便不能阅读

在水平和垂直方向的二维空间存储信息的条形码, 称为二维条形码(2-dimensional bar code)。

与一维条形码一样,二维条形码也有许多不同的编码方法,或称码制。就这些码制的编码原理而言,通常可分为以下三种类型

1. 线性堆叠式二维码 是在一维条形码编码原理的基础上,将多个一维码在纵向堆叠而产生的。典型的码制如:Code 16K、Code 49、PDF417等。

2. 矩阵式二维码 是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。典型的码制如: Aztec、Maxi Code、QR Code、 Data Matrix等。

3. 邮政码 通过不同长度的条进行编码,主要用于邮件编码,如:Postnet、BPO 4-State。

在许多种类的二维条形码中,常用的码制有:Data Matrix, Maxi Code, Aztec, QR Code, Vericode, PDF417, Ultracode, Code 49, Code 16K 等,其中:

* Data Matrix 主要用于电子行业小零件的标识,如Intel的奔腾处理器的背面就印制了这种码。

* Maxi Code 是由美国联合包裹服务(UPS)公司研制的,用于包裹的分拣和跟踪。

* Aztec 是由美国韦林(Welch Allyn)公司推出的,最多可容纳3832个数字或3067个字母字符或1914个字节的数据。

下面,我们以PDF417码为例,介绍二维条形码的特性和特点。

一)PDF417简介

PDF417码是由留美华人王寅敬(音)博士发明的。PDF是取英文Portable Data File三个单词的首字母的缩写,意为“便携数据文件”。因为组成条形码的每一符号字符都是由4个条和4个空构成,如果将组成条形码的最窄条或空称为一个模块,则上述的4个条和4个空的总模块数一定为17,所以称417码或PDF417码。

二)PDF417的特点

1. 信息容量大 PDF417码除可以表示字母、数字、ASCII字符外,还能表达二进制数。为了使得编码更加紧凑,提高信息密度,PDF417在编码时有三种格式:

* 扩展的字母数字压缩格式 可容纳1850 个字符;

* 二进制 / ASCII格式 可容纳1108 个字节;

* 数字压缩格式 可容纳2710 个数字。

2. 错误纠正能力 一维条形码通常具有校验功能以防止错读,一旦条形码发生污损将被拒读。而二维条形码不仅能防止错误,而且能纠正错误,即使条形码部分损坏,也能将正确的信息还原出来。

3. 印制要求不高 普通打印设备均可打印,传真件也能阅读。

4. 可用多种阅读设备阅读 PDF417码可用带光栅的激光阅读器,线性及面扫描的图像式阅读器阅读。

5. 尺寸可调以适应不同的打印空间

6. 码制公开已形成国际标准,我国也已制定了417码的国标。

三)PDF417的纠错功能

二维条形码的纠错功能是通过将部分信息重复表示(冗余)来实现的。比如在PDF417码中,某一行除了包含本行的信息外,还有一些反映其它位置上的字符(错误纠正码)的信息。这样,即使当条形码的某部分遭到损坏,也可以通过存在于其它位置的错误纠正码将其信息还原出来。

PDF417的纠错能力依错误纠正码字数的不同分为0~8共9级,见图4,级别越高,纠正码字数越多,纠正能力越强,条形码也越大。当纠正等级为8时,即使条形码污损50%也能被正确读出,如图5。

四)PDF417的几种变形

如图6,PDF417还有几种变形的码制形式:

* PDF417截短码 在相对“干净”的环境中,条形码损坏的可能性很小,则可将右边的行指示符省略并减少终止符。

* PDF417微码 进一步缩减的PDF码。

* 宏PDF417码 当文件内容太长,无法用一个PDF417码表示时,可用包含多个(1~99999个)条形码分块的宏PDF417码来表示。

二维条形码的优势

从以上的介绍可以看出,与一维条形码相比二维条形码有着明显的优势,归纳起来主要有以下几个方面:

一)数据容量更大

图中的PDF417码包含了文字框中的所有文字。

二)超越了字母数字的限制

三)条形码相对尺寸小

四)具有抗损毁能力


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12461386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存