0x01 条形码概述
条码是将线条与空白按照一定的编码规则组合起来的符号,用以代表一定的字母、数字等资料。
在进行辨识的时候,是用条码阅读机扫描,得到一组反射光信号,此信号经光电转换后变为一组与线条、空白相对应的电子讯号,经解码后还原为相应的文数字,再传入电脑。
条码辨识技术已相当成熟,其读取的错误率约为百万分之一,首读率大于98%,是一种可靠性高、输入快速、准确性高、成本低、应用面广的资料自动收集技术。
条码生成规则
世界上约有225种以上的一维条码,每种一维条码都有自己的一套编码规格,规定每个字母(可能是文字或数字或文数字)是由几个线条(Bar)及几个空白(Space)组成,以及字母的排列。
人们可以根据不同的业务需求选用不同的编码方式,一般较流行的一维条码有39码、EAN码、UPC 码、128码,以及专门用于书刊管理的ISBN、ISSN等。比较流行的二维码还包括PDF417 、QR code 等。
在第四章会列出主流条码的样式及特点,在此只做简单描述。
【EAN、UPC码】商品条码,用于在世界范围内唯一标识一种商品。我们在超市中最常见的就是EAN和UPC条码。
其中,EAN码是当今世界上广为使用的商品条码,已成为电子数据交换(EDI)的基础;UPC码主要为美国和加拿大使用。
【Code39码】因其可采用数字与字母共同组成的方式而在各行业内部管理上被广泛使用。
【ITF25码】在物流管理中应用较多。
【Codebar码】多用于血库,图书馆和照像馆的业务中。
【Code128码】可表示ASCII 0 到 ASCII 127 共计128个ASCII字符。
【QR code】矩阵二维码,高速全方位识读。
扫码器类型及工作原理
条码扫描器(Barcode Reader ,或称Scanner)
用以扫瞄条码,读取条码所代表字元、数值及符号的周边设备称为条码扫瞄器。其原理是藉由电源激发「发光二极体」而射出一束红外线「扫瞄」条码,由于空白会比线条反映回来更多的光度,藉由这些明暗关系,让光感应接收器的反射光有着不同的类比信号,然后再经由解码器译成资料。条码扫瞄器的类型大致可分为下列几种:
1. 笔式扫描器(Wand,俗称光笔)
是一种外型像笔的扫瞄器,使用时以机就物,即移动光笔去扫瞄物体上的条码。光笔的价格大众化,但扫瞄的长度稍受限制,大约在32个字元左右,较适合一般小商店及个人使用。
2. 固定式扫描器(Fix-mount Scanner)
为一种体积较大,价格较高的扫瞄系统,使用时以物就机,即机器固定,以物品的移动来扫瞄解码,适用于输送带或一般大型超市。
3. CCD扫描器
CCD(Change Coupled Device, 光耦合装置)扫瞄器采用发光二极体的泛光源照明整个条码,再透过平面镜与光栅将条码符号映射到由光电二极体组成的探测器阵列上,经探测器完成光电转换,再由电路系统对探测器阵列中的每一光电二极体依次采集信号,辨识出条码符号,完成扫瞄。CCD扫瞄器的优点是操作方便,不直接接触条码也可辨读,性能较可靠,寿命较长,且价格较雷射扫瞄器便宜。
4. 雷射扫描器(Laser Scanner)
藉由雷射光束的扫瞄来读取条码的资料,由于它和光笔式扫瞄器一样,可自由移动到物体处扫瞄,因此条码的长度在容许的范围下并不会受到限制,不过光笔一定要接触到条码的表面才能辨读,雷射扫瞄器的扫瞄距离较光笔、CCD来得远,故在扫瞄时则可悬空划过条码。
0x02 轮子
使用PHP生成条形码有很多开源的项目,所以并没有自己造轮子,只是了解了条码的原理借了别人的轮子。
gitHub地址
https://github.com/picqer/php-barcode-generator
使用方式
1. 使用composer安装picqer/php-barcode-generator
2. 使用BarcodeGeneratorPNG类实例进行条形码生成操作
其他说明
1. 该库只支持一维码的生成,不支持二维码,二维码可使用endroid/qr-code
2. 支持生成SVG,PNG,JPG和HTM
0x03 Code128的条码生成规则
本章将以Code128为例来讲述条形码生成规则
Code 128 条形码可以表示全部 128 个 ASCII 码字符(数字、大小写字母、符号和控制符)。
Code 128 有三个子集:Code 128A、Code 128B 和 Code 128C。
Code 128A 用来编码数字、大写字母、控制符、部分符号;
Code 128B 用来编码数字、大写字母、小写字母、符号;
Code 128C 用来编码 2 位数字 [00,99]。
Code128一般由 起始位+数据位+校验位+终止位
起始位由三种,分别区分Code128A、Code128B、Code128C,内容为A) 211412 B) 211214 C) 211232;
数据位根据编码表一一对应,编码表会放在本文附录中;
校验位算法:校验码=(起始字符值 +第一位数据值*1 +第二位数据值*2+ …. + 第 n 位数据*n )%103;
这里所说的数值指的是在编码表中的序号,从0-106
终止位只有一个,内容为2331112。
如上图我们可以直观看到Code128是黑白相间的条形码,我们把黑的叫“条”(B),白的叫“空”(S)。
仔细观察,条和空都有4种不同的宽度,我们将它从细到粗赋予1、2、3、4这几个值。
然后我们开始从左向右按照粗细的值来阅读条码,并按照六个一块划分,结果如下:
(眼快看瞎了,小技巧:白色的3比黑色的3稍微大一些,千万别数成4,可能是因为黑色显瘦吧)
211214 111323 124211 421211 132212 221213 123221 223211 221231 221213 122132 213311 231131 232121 2331112
除去尾部的2331112,最后一块为校验位,用于检查该条形码是否被正确编码。
这样数据段的内容为:
111323 124211 421211 132212 221213 123221 223211 221231 221213 122132 213311 231131
按照附录中的编码表即可读出结果
0x04条码的类型及特点
一维码
【EAN码】EAN码是国际物品编码协会制定的一种商品用条码,通用于全世界。EAN码符号有标准版(EAN-13)和缩短版(EAN-8)两种,我国的通用商品条码与其等效,日常购买的商品包装上所印的条码一般就是EAN码。如图所示:
【UPC码】 UPC码是美国统一代码委员会制定的一种商品用条码,主要用于美国和加拿大地区,我们在美国进口的商品上可以看到。如图所示:
【39码】 39码是一种可表示数字、字母等信息的条码,主要用于工业、图书及票证的自动化管理,目前使用极为广泛。如图所示:
【Code 93码】 Code 93码与39码具有相同的字符集,但它的密度要比39码高,所以在面积不足的情况下,可以用93码代替39码。
【库德巴码】库德巴码也可表示数字和字母信息,主要用于医疗卫生、图书情报、物资等领域的自动识别。如图所示:
【Code 128 码】128可表示ASCII 0 到 ASCII 127 共计128个ASCII字符。如图所示:
【ITF 25 条码】交插25码是一种条和空都表示信息的条码,交插25码有两种单元宽度,每一个条码字符由五个单元组成,其中二个宽单元,三个窄单元。在一个交插25码符号中,组成条码符号的字符个数为偶数,当字符是奇数个时,应在左侧补0变为偶数。条码字符从左到右,奇数位置字符用条表示,偶数位字符用空表示。交插25码的字符集包括数字0到9。如图示:
【Industrial 25 条码】Industrial 25码只能表示数字,有两种单元宽度。每个条码字符由五个条组成,其中两个宽条,其余为窄条。这种条码的空不表示信息,只用来分隔条,一般取与窄条相同的宽宽度。如图示:
【Matrix 25 条码】Matrix 25码只能表示数字0到9。当采用Matrix25码的编码规范,而采用ITF25码的启始符和终止符时,生成的条码就是中国邮政码。
二维码
【PDF417 二维条码】
PDF417是一种堆叠式二维条码,目前应用最为广泛。PDF417条码是由美国SYMBOL公司发明的,PDF(Portable Data File)意为"便携数据文件"。组成条码的每一个条码字符由4个条和4个空,共17个模块构成,故称为PDF417条码。
PDF417条码可表示数字、字母或二进制数据,也可表示汉字。一个PDF417条码最多可容纳1850个字符或1108 个字节的二进制数据,如果只表示数字则可容纳2710个数字。PDF417的纠错能力分为9级,级别越高,纠正能力越强。由于这种纠错功能,使得污损的417条码也可以正确读出。我国目前已制定了PDF417码的国家标准。 PDF417条码需要有417解码功能的条码阅读器才能识别。
PDF417条码最大的优势在于其庞大的数据容量和极强的纠错能力。当PDF417条码用于防伪时,并不是PDF417条码不能被复制,而是由于使用PDF417条码可以将大量的数据快速读入计算机,使得大规模的防伪检验成为可能。
【QR Code 二维条码】QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它除具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点外,还具有如下主要特点:
⑴超高速识读
从QR Code码的英文名称Quick Response Code可以看出,超高速识读特点是QR Code码区别于四一七条码、Data Matrix等二维码的主要特性。由于在用CCD识读QR Code码时,整个QR Code码符号中信息的读取是通过QR Code码符号的位置探测图形,用硬件来实现,因此,信息识读过程所需时间很短,它具有超高速识读特点。用CCD二维条码识读设备,每秒可识读30个含有100个字符的QR Code码符号;对于含有相同数据信息的四一七条码符号,每秒仅能识读3个符号;对于Data Martix矩阵码,每秒仅能识读2~3个符号。QR Code码的超高速识读特性是它能够广泛应用于工业自动化生产线管理等领域。
⑵全方位识读
QR Code码具有全方位(360°)识读特点,这是QR Code码优于行排式二维条码如四一七条码的另一主要特点,由于四一七条码是将一维条码符号在行排高度上的截短来实现的,因此,它很难实现全方位识读,其识读方位角仅为±10°。
能够有效地表示中国汉字、日本汉字:
由于QR Code码用特定的数据压缩模式表示中国汉字和日本汉字,它仅用13bit可表示一个汉字,而四一七条码、Data Martix等二维码没有特定的汉字表示模式,因此仅用字节表示模式来表示汉字,在用字节模式表示汉字时,需用16bit(二个字节)表示一个汉字,因此QR Code码比其它的二维条码表示汉字的效率提高了20%。二维条形码的优势
从以上的介绍可以看出,
参考文献
附录
Code128编码表
注:ABC分别为128A类,128B类,128C类的字符表。有些B类的字符为空表示和A类的一样,序号空的部分表示和C内容一样。
B,S,B,S,B,S// A B C 序号
2,1,2,2,2,2,// sp 00
2,2,2,1,2,2,// ! 01
2,2,2,2,2,1,// " 02
1,2,1,2,2,3,// # 03
1,2,1,3,2,2,// $ 04
1,3,1,2,2,2,// % 05
1,2,2,2,1,3,// & 06
1,2,2,3,1,2,// ... 07
1,3,2,2,1,2,// ( 08
2,2,1,2,1,3,// ) 09
2,2,1,3,1,2,// * 10
2,3,1,2,1,2,// + 11
1,1,2,2,3,2,// , 12
1,2,2,1,3,2,// - 13
1,2,2,2,3,1,// . 14
1,1,3,2,2,2,// / 15
1,2,3,1,2,2,// 0 16
1,2,3,2,2,1,// 1 17
2,2,3,2,1,1,// 2 18
2,2,1,1,3,2,// 3 19
2,2,1,2,3,1,// 4 20
2,1,3,2,1,2,// 5 21
2,2,3,1,1,2,// 6 22
3,1,2,1,3,1,// 7 23
3,1,1,2,2,2,// 8 24
3,2,1,1,2,2,// 9 25
3,2,1,2,2,1,// : 26
3,1,2,2,1,2,// ; 27
3,2,2,1,1,2,// < 28
3,2,2,2,1,1,// = 29
2,1,2,1,2,3,// > 30
2,1,2,3,2,1,// ? 31
2,3,2,1,2,1,// @ 32
1,1,1,3,2,3,// A 33
1,3,1,1,2,3,// B 34
1,3,1,3,2,1,// C 35
1,1,2,3,1,3,// D 36
1,3,2,1,1,3,// E 37
1,3,2,3,1,1,// F 38
2,1,1,3,1,3,// G 39
2,3,1,1,1,3,// H 40
2,3,1,3,1,1,// I 41
1,1,2,1,3,3,// J 42
1,1,2,3,3,1,// K 43
1,3,2,1,3,1,// L 44
1,1,3,1,2,3,// M 45
1,1,3,3,2,1,// N 46
1,3,3,1,2,1,// O 47
3,1,3,1,2,1,// P 48
2,1,1,3,3,1,// Q 49
2,3,1,1,3,1,// R 50
2,1,3,1,1,3,// S 51
2,1,3,3,1,1,// T 52
2,1,3,1,3,1,// U 53
3,1,1,1,2,3,// V 54
3,1,1,3,2,1,// W 55
3,3,1,1,2,1,// X 56
3,1,2,1,1,3,// Y 57
3,1,2,3,1,1,// Z 58
3,3,2,1,1,1,// [ 59
3,1,3,1,1,1,// \ 60
2,2,1,4,1,1,// ] 61
4,3,1,1,1,1,// ^ 62
1,1,1,2,2,4,// _ 63
1,1,1,4,2,2,// NUL ' 64
1,2,1,1,2,4,// SOH a 65
1,2,1,4,2,1,// STX b 66
1,4,1,1,2,2,// ETX c 67
1,4,1,2,2,1,// EOT d 68
1,1,2,2,1,4,// ENQ e 69
1,1,2,4,1,2,// ACK f 70
1,2,2,1,1,4,// BEL g 71
1,2,2,4,1,1,// BS h 72
1,4,2,1,1,2,// HT i 73
1,4,2,2,1,1,// LF j 74
2,4,1,2,1,1,// VT k 75
2,2,1,1,1,4,// FF l 76
4,1,3,1,1,1,// CR m 77
2,4,1,1,1,2,// SO n 78
1,3,4,1,1,1,// SI o 79
1,1,1,2,4,2,// DLE p 80
1,2,1,1,4,2,// DC1 q 81
1,2,1,2,4,1,// DC2 r 82
1,1,4,2,1,2,// DC3 s 83
1,2,4,1,1,2,// DC4 t 84
1,2,4,2,1,1,// NAK u 85
4,1,1,2,1,2,// SYN v 86
4,2,1,1,1,2,// ETB w 87
4,2,1,2,1,1,// CAN x 88
2,1,2,1,3,1,// EM y 89
2,1,4,1,2,1,// SUB z 90
4,1,2,1,2,1,// ESC { 91
1,1,1,1,4,3,// FS | 92
1,1,1,3,4,1,// GS } 93
1,3,1,1,4,1,// RS ~ 94
1,1,4,1,1,3,// US DEL 95
1,1,4,3,1,1,// FNC3 FNC3 96
4,1,1,1,1,3,// FNC2 FNC2 97
4,1,1,3,1,1,// SHIFT SHIFT 98
1,1,3,1,4,1,// CodeC CodeC 99
1,1,4,1,3,1,// CodeB FNC4 CodeB 100
3,1,1,1,4,1,// FNC4 CodeA CodeA 101
4,1,1,1,3,1,// FNC1 FNC1 FNC1 102
2,1,1,4,1,2,// StartA 103
2,1,1,2,1,4,// StartB 104
2,1,1,2,3,2,// StartC 105
2,3,3,1,1,1,2,// Stop 106