二维码
前几天公司分配任务调研二维码,所以将所发现的结果记下来。
无论是商品条形码还是大家所熟悉的二维码,网上的资料只是一些简介以及封装好的dll,有的dll扫出来的结果会大失所望,因为只能扫初来数字,其他类型的数据都会被扫成数字,这样就让人头疼,是个dll还扫的不对。
不得不承认日本人还真是聪明,发明的这玩意风靡一时,但是笔者最痛恨日本人,所以后面壁纸所修改的dll并没有用日本字测试,有需要的自己去研究吧。
笔者提供一个代码,是修改后的,既可以扫出汉字,也可以扫出数字和混合的数字字母,不要小看这几种状态,都以为是字符串,其实不是,在内部实现上,会根据不同的数据类型来判断,执行不同的代码,所以不同的类型就会有不同的大小。比如我设置好相同参数后,有的dll扫出来的字符串可以输入10个字符,有的就只能输入4个字符,这就是里面的判断机制有问题。关于参数以及不同类型所对应的大小网上资料都有,大家可以搜一下。
下面简介下(是我写的调研结果里面的截取):
1,一维条形码
一维条形码本文主要描述商品条码数字的含义(EAN-13)
1) 码制
码制即指条码条和空的排列规则,常用的一维码的码制包括:EAN码、39码、交叉25码、UPC码、128码、93码,ISBN码,及Codabar(库德巴码)等。
不同的码制有它们各自的应用领域:
EAN 码:是国际通用的符号体系,是一种长度固定、无含意的条码,所表达的信息全部为数字,主要应用于商品标识
39码和128码:为目前国内企业内部自定义码制,可以根据需要确定条码的长度和信息,它编码的信息可以是数字,也可以包含字母,主要应用于工业生产线领域、图书管理等
93码:是一种类似于39码的条码,它的密度较高,能够替代39码
25码:主要应用于包装、运输以及国际航空系统的机票顺序编号等
Codabar码:应用于血库、图书馆、包裹等的跟踪管理
ISBN:用于图书管理
2) 数字含义
商品条码数字的含义(EAN-13)
标准码: 由13位数字构成的条码称为标准码
标准码尺寸为:37.29mm×26.26mm,放大系数取值范围是0.80-2.00,间隔为0.05。
以条形码 6936983800013为例
此条形码分为4个部分,从左到右分别为:
1-3位:共3位,对应该条码的693,是中国的国家代码之一。(690--695都是中国大陆的代码,由国际上分配),详见附录1。
4-8位:共5位,对应该条码的69838,代表着生产厂商代码,由厂商申请,国家分配
9-12位:共4位,对应该条码的0001,代表着厂内商品代码,由厂商自行确定
第13位:共1位,对应该条码的3,是校验码,依据一定的算法,由前面12位数字计算而得到。
(公式第13位算法
1:取出该数的奇数位的和,c1=6+3+9+3+0+0=21;
2:取出该数的偶数位的和,c2=9+6+8+8+0+1=32;
3:将奇数位的和与“偶数位的和的三倍”相加。
4:取出结果的个位数:117(117%10=7);
5:用10减去这个个位数:10-7=3;
6:对得到的数再取个位数(对10去余)3%10=3;
)
3) 需要加载的dll
a.存放地址:
code.dll(.. \条码调研结果\dll\ code.dll)
b.提供的函数:
MakeBarCode 生成一维条码的函数
4) 编写代码
a.添加头文件
using System.Runtime.InteropServices;
b.指示该特性化的方法由非托管动态链接库(DLL)作为静态入口点公开
[DllImport("code.dll", EntryPoint = "MakeBarCode")]
private static extern int MakeBarCode(Int32 nBType, string lpszText, Int16 nNarrow, Int16 nWide, Int16 nHeight, Int16 nRotate, Int16 nReadable, Int16 err);
c.参数
nBType:条码码制,可是下列值这一:
CODE39 标准三九码
EAN13 EAN 13码
CODE128 CODE 128码
CODE25 CODE 25码
ITF25 ITF 25码
UPCA UPC A 码
EAN8 EAN 8码
UPCE UPC E码
MATRIX25 Matrix 25码
EAN128 EAN 128码
CODEBAR CodeBar码
CODE93 Code 93码,可表示全部128个ASCII字符
FULLASCII39 全 ASCII 39码,,可表示全部127个ASCII字符
lpszText:条码字符串
一些码制会对该字符串进行修改:
标准39码和STANDARD93码,所有小写字符会被转换成大写。
EAN13、EAN8、UPCA、UPCE最后一位将被正确的校验字符代替,且UPCE第一位被设为“0”。
nNarrow:窄单元宽度,必须大于1。
nWide:宽单元宽度,对于标准三九码、CODE 25码、ITF 25码、Matrix 25码、CodeBar码,nWide必须是nNarrow的2至3位,其它码制,此参数未用。
nHeight:条码高度,必须大于1。
nRotate:旋转角度,可是下列值之一:
ROTATE_0 不旋转
ROTATE_90 逆时针旋转90度
ROTATE_180 逆时针旋转180度
ROTATE_270 逆时针旋转270度
nReadable:可读性文字,可取下列值之一:
READABLE_NULL 没有可读性文字
READABLE_LEFT 居左
READABLE_RIGHT 居右
READABLE_CENTER 居中
READABLE_FULL 撑满
READABLE_ABOVE 可读性文字在条码上方
对于EAN13、UPCA、EAN8和UPCE条码,此参数不可控制文字对齐方式及文字位置;
默认文字在条码下方,可以加上READABLE_ABOVE将文字设定在条码上方;
文字默认字体为OCR-B-10 BT,目前还不能改变字体名称和大小;
如条码高度太低,不足以放置可读性文字,则自动不产生可读性文字。
err:指向DWORD的指针,用于设置错误提示,返回错误信息。
如为NULL,则不显示错误提示,并且不返回错误码
否则指向的值可取下列值之一:
DISABLE_DISPLAY_MESSAGE 不显示错误提示信息
ENABLE_DISPLAY_ERROR_MESSAGE 只显示错误信息
ENABLE_DISPLAY_WARNING_MESSAGE 只显示警告信息
ENABLE_DISPLAY_ALL_MESSAGE 显示错误和警告信息
返回值如下:
ERR_SUCCESS 正常完成
ERR_INVALID_BTYPE 无效的码制
ERR_INVALID_NARROW 无效的nNarrow值
ERR_INVALID_HEIGHT 无效的码高
ERR_INVALID_CHAR 含有无效的字符
ERR_INVALID_WIDE 无效的nWide值
ERR_INVALID_LEN 无效的码长,如果是EAN13码,则码长必须是13位,UPCA为12位,UPCE和EAN8为8位,其它条码不能零长度,也不能超过最大允许长度。
ERR_INVALID_ROTATE 无效的旋转角度
ERR_MEMORY 内存不足
ERR_UNKNOWN 其它未知错误
返回值:
函数调用成功,返回生成位图的句柄,失败返回NULL,可通过设置err参数,取得错误码。
d.参数默认值
nNarrow:窄单元宽度,默认为2
nWide:宽单元宽度,对于标准三九码、CODE 25码、ITF 25码、Matrix 25码、CodeBar码,nWide必须是nNarrow的2至3位,其它码制,默认为5
nHeight:条码高度,默认为100
2,二维条形码
二维条形码本文主要描述PDF417和QR Code
1)分类
(1) 堆叠式/行排式二维条码(又称堆积式或层排式),其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49.PDF417等。
(2) 矩阵式二维码 (又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、Maxi Code、QR Code、 Data Matrix等。
(1)PDF417条码
PDF417是一种多层、可变长度、具有高容错和纠错能力的二维条码。每一个PDF417符号可以表示1100个字节,或1800个ASCLL字符或2700个数字的信息。
a. 需要加载的dll
存放地址:
code.dll(.. \条码调研结果\dll\ code.dll)
提供的函数:
MakePDF417 生成PDF417条码的函数
b. 添加头文件
using System.Runtime.InteropServices;
c.指示该特性化的方法由非托管动态链接库(DLL)作为静态入口点公开
[DllImport("code.dll", EntryPoint = "MakePDF417")]
private static extern int MakePDF417(string lpData, int dwBytes, Int16 nRows, Int16 nCols, Int16 nEccLevel, Int16 nRotate, Int16 xScale, Int16 yScale, out Int16 err);
d.参数
lpData:指向要生成PDF417条码的数据;
dwBytes:lpData所指向的数据区的长度;
nRows、nCols:PDF417符号的行数和列数,如设为0,则自动计算行、列数;
nEccLevel:PDF417符号的错误校正级别;
nRotate:符号旋转角度,同MakeBarCode;
xScale、yScale:PDF417符号X、Y方向的放大倍数;
err:错误代码,同MakeBarCode;
下列错误代码为PDF417专用:
ERR_INVALID_ECCLEVEL 无效的错误校正级别
ERR_INVALID_ROWCOL 无效的行、列数
e.参数默认值
417条码的行数,3——90
417条码的列数,1——30
纠错级别,0——8
条码旋转角度,0、90、180、270
条码字符X方向放大倍数 默认2
条码字符Y方向放大倍数 默认6
返回生成条码图的Image对象
(2)QR Code条码(使用QRCode.dll)
a.需要添加的引用
QRCode
因为需要添加该引用的部分头文件
c. 需要添加的头文件
using System.Runtime.InteropServices;
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;
using ThoughtWorks.QRCode.Codec.Util;
d.赋值
I QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
QRCodeEncoder是ThoughtWorks.QRCode.Codec.QRCodeEncoder里面定义的一个类,给类里面的字段赋值后,然后调用类里面的Encode方法,就会返回生成位图的句柄,生成二维码。
II BmpBar = qrCodeEncoder.Encode(lpData);
QR数据(二维码扫出来的内容) string lpData
返回生成位图句柄 Image BmpBar
III qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
纠错级别L,M,Q,H默认为M
IV qrCodeEncoder.QRCodeVersion = iVersion;
QR码的版本1-40,默认为8
即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本每边增加4个模块。
V qrCodeEncoder.QRCodeScale = iScale;
绘图模块大小2-10,默认为4
问题:只能扫出数字
(3)改进后的QR Code条码
a.需要添加的引用
ThoughtWorks.QRCode.dll
因为需要添加该引用的部分头文件
d. 需要添加的头文件
using ThoughtWorks.QRCode.Codec.Data;
using ThoughtWorks.QRCode.Codec;
d.赋值
I QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
QRCodeEncoder是ThoughtWorks.QRCode.Codec.QRCodeEncoder里面定义的一个类,给类里面的字段赋值后,然后调用类里面的Encode方法,就会返回生成位图的句柄,生成二维码。
II BmpBar = qrCodeEncoder.Encode(lpData);
QR数据(二维码扫出来的内容) string lpData
返回生成位图句柄 Image BmpBar
III qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
纠错级别L,M,Q,H默认为M
IV qrCodeEncoder.QRCodeVersion = iVersion;
QR码的版本1-40,默认为8
即二维码的规格,QR码符号共有40种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本每边增加4个模块。
V qrCodeEncoder.QRCodeScale = iScale;
绘图模块大小2-10,默认为4
e.注意
二维码编码分为英文,数字,汉字三种编码格式,针对三种编码格式,我已经在类库里面改好,可以自动识别所输入的数据来判断使用哪种格式,详见.. \二维码调研结果\代码示例\QRDemo\QRCodeLib\util\QRCodeUtility.cs中的IsUniCode(string value)方法,因为英文里面只包含数字和大写字母,所以将含有小写字母的放到了汉字编码中,每种编码设置好参数后,输入数据的长度大小都有一定的限制,如QRCode_编码解码标准.pdf的25至29页,输入数据时请参考,如果扫不出来则请检查数据长度。
未完待续
浙公网安备 33010602011771号