二维码

      前几天公司分配任务调研二维码,所以将所发现的结果记下来。

      无论是商品条形码还是大家所熟悉的二维码,网上的资料只是一些简介以及封装好的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页,输入数据时请参考,如果扫不出来则请检查数据长度。

 未完待续

posted on 2013-11-25 18:02  lk我怀念的  阅读(737)  评论(0)    收藏  举报

导航