首页 > 编程知识 正文

zxing识别二维码(zxing条码扫描器)

时间:2023-05-05 09:42:42 阅读:64342 作者:931

2021SC@SDUSC

目录一、PDF417简介1.1简介1.2 PDF417二维码结构1.3 PDF417二维码大小1.4 PDF417二维码纠错能力1.5 PDF417特性2、PDF417Writer、class PDF417参考资料:

前言:本博客简要介绍了PDF417代码的相关知识和编码步骤。

另一方面,PDF417概要1.1概要PDF417是美国符号技术(Symbol Technologies,Inc.)发明的二维码,是堆栈式二维码。 便携式数据文件(pdf )是指“便携式数据文件”,构成条形码的每个条形码字符由四个条形码和四个空的共17个模块组成,因此称为PDF417条形码要识别PDF417条形码,需要具有417解码功能的条形码读取器。 发明者是台湾美国学生甜裙博士,隐形毛皮大虾1984年毕业于国立交通大学信息系,获得纽约州立大学石溪分校(universityofnewyorkatstonybrook )计算机硕士和博士学位后, 1988年进入符号技术进行二维码开发,1992年底推出PDF417,1988年1993年3月,作者正式将pdf 417引入台湾,通过祥记信息推广和开发相关包装(兴奋小白菜,1995 )

目前,PDF417、Maxicode、Datamatrix是美国国家标准协会(americannationalstandardsinstitute, ANSI )被MH10 SBC-8委员会评为二维条形码国际标准制定范围,其中PDF417主要适用于运输包裹和商品资料标签) )的PDF417不仅有检测错误的能力,而且可以从受损的条形码中获取完整的数据(Moore,)

PDF417条形码是高密度、高信息含量的手机数据文件,是实现证书、卡片等大容量、高可靠性信息自动存储、手机、机器自动识别的理想手段。

PDF417代码可应用于证书管理、许可证年检、报告管理、机电产品生产和分组布线、银行票据管理和行李、货物运输和邮政。 PDF417条形码的最大优点是其巨大的数据容量和极强的纠错能力。

1.2 PDF417二维码结构由于PDF417二维码容量较大,除对人的姓名、单位、地址、电话等基本资料进行编码外,还可以将人体特征,如指纹、视网膜扫描、照片等个人记录存储在条形码中,可以自动输入证明资料PDF417开始适用于美国、加拿大和新西兰交通部门的驾照年审、车辆违章登记、罚款和定期检查。 美国同时将PDF417应用于身份证、驾照、军人证书。 此外,墨西哥还将PDF417应用于报关文件和证件,以防止仿制和犯罪。

PDF417是一个开放的条形码系统,因为它是公共代码,任何人都可以使用该算法而无需付费。 PDF417的PDF是便携式数据文件(Portable Data File )的缩写,因其可以像数据文件一样读取条形码,存储更多数据,可以随身携带,也可以与产品一起行走而得名(PDF417 ) 顾名思义,一个PDF代码最多可以包含1,108个字符(字节)的字母数字字符,而压缩数字后最多可以包含2729个字节。

每个PDF417代码堆叠成3~90行,但为了便于扫描,其周围有静空区,静空分为水平静空区和垂直静空区,至少应为0.020英寸。

每一层包括五个部分:

开始代码。

左标记:起始代码后面是指示符号字符。

数据区:可以存储1到30个数据字符。

右标记区域:位于数据区域的后面,是指示符号字符。

结束代码:在横列的最右边。

除了开始代码和结束代码之外,左标记部分、数据部分和右标记部分的构成字符也可以称为代码。 每条代码由17个模块组成,每条代码可以分为4条线(或黑线)和4个空白(或白线),每条线最多不能超过6个模块的宽度。 每个417码根据数据大小而定,其行数和每行的数据模块数和字数可以从1到30不等。 代码的构成如下。

1.3由于PDF417二维码的大小和符号组合的灵活性,每个PDF417二维码可以按不同的物理设备以不同的长宽比和密度打印,以适应打印和扫描条件的要求。 其中,每个模块的宽度x是PDF417码中最重要的大小之一,x值的最小限制为0.0075英寸(约0.191mm ),且在同一条形码符号中x值恒定。

PDF417的最小高度和长度可通过以下公式计算:

w=(17c 69 ) X 2Q

H=R Y 2Q

其中:

W=导线宽度,H=导线高度,X=导线模块宽度,Y=级数

C=各级符号文字总数(包括左右标区)、R=层高、Q=静空区的大小

1.4 PDF417二维码纠错能力PDF417二维码的一个重要特性是自动纠错能力强。 然而,PDF417的纠错能力与每个条形码可以存储的数据量有关,PDF417码将错误恢复为9级,其值从0到8。

级数愈高,错误纠正能力愈强,但可存放资料量就愈少,一般建议编入至少10%的检查字码。资料存放量与错误纠正等级的关系如下表所示:

错误纠正等级纠正码数可存资料量(位元)自动设定641024021108141106281101316109243210725641024612895772568048512496

下表建议不同的字数所适用的错误纠正等级;

资料字码数错误纠正等级1~40240~1603161~3204321~8635

如前所述,错误纠正等级涉及拒读错误(E错误)与替代错误(T错误)两种错误类型。无论使用哪一种条码机都有一定的精密度极限,造成线条和空白的宽度与理想宽度间必有偏差存在,条码扫瞄设备能够读出解码演算法所允许范围内的不精确条码符号,目前标准中规定X的值最小为0.0075英寸(约0.191mm),此一限制同时反映出目前标准设备的技术现状。

1.5 PDF417的特性

综合本节所讨论,PDF417的特性如下表所示:

项目特性可编码字元集8位二进制资料,多达811800种不同的字元集或解释类型连续型,多层字元自我检查有尺寸可变高:390层宽:130栏读码方式双向可读错误纠正字码数2~512个最大资料容量安全等级为0, 每个符号可表示1108个位元二、PDF417Writer

与之前介绍的二维码类似,PDF417Writer类继承了父类Writer。

PDF417Writer有两个静态变量:

分别表示代码周围的默认空白(边距)和默认错误更正级别。

private static final int WHITE_SPACE = 30; private static final int DEFAULT_ERROR_CORRECTION_LEVEL = 2;

PDF 417的值是由一个数组来保存的。

input 是一个信息字节数组,0为黑色,1为白色;
margin 是条形码周围的边距边框;
返回输入的位矩阵。

private static BitMatrix bitMatrixFromBitArray(byte[][] input, int margin) { // 创建带有额外空格的位矩阵 BitMatrix output = new BitMatrix(input[0].length + 2 * margin, input.length + 2 * margin); output.clear(); for (int y = 0, yOutput = output.getHeight() - margin - 1; y < input.length; y++, yOutput--) { byte[] inputY = input[y]; for (int x = 0; x < input[0].length; x++) { // 零在字节矩阵中为白色 if (inputY[x] == 1) { output.set(x + margin, yOutput); } } } return output; }

除此之外,还有函数rotateArray(),获取PDF417二维码数组并将其旋转90度。
这使得旋转屏幕时二维码在屏幕上的方向一致。

private static byte[][] rotateArray(byte[][] bitarray) { byte[][] temp = new byte[bitarray[0].length][bitarray.length]; for (int ii = 0; ii < bitarray.length; ii++) { int inverseii = bitarray.length - ii - 1; for (int 完美的过客 = 0; 完美的过客 < bitarray[0].length; 完美的过客++) { temp[完美的过客][inverseii] = bitarray[ii][完美的过客]; } } return temp; } 三、class PDF417

PDF417实现的逻辑部分的顶级类。

有两个静态变量,分别表示启动模式(17位)和停止模式(18位)。

private static final int START_PATTERN = 0x1fea8; private static final int STOP_PATTERN = 0x3fa29;

接下来介绍几种set方法:

setDimensions(int maxCols, int minCols, int maxRows, int minRows) 用来设置最大/最小行/列值,其参数分别表示允许的最大列数、允许的最小列数、允许的最大行数、允许的最小行数。

setCompaction(Compaction compaction)设置要使用的压缩模式。

setCompact(boolean compact)如果compact为真,则启用压缩。

setEncoding(Charset encoding)设置要使用的字符编码。

public void setDimensions(int maxCols, int minCols, int maxRows, int minRows) { this.maxCols = maxCols; this.minCols = minCols; this.maxRows = maxRows; this.minRows = minRows; } public void setCompaction(Compaction compaction) { this.compaction = compaction; } public void setCompact(boolean compact) { this.compact = compact; } public void setEncoding(Charset encoding) { this.encoding = encoding; }

determineDimensions(int sourceCodeWords, int errorCorrectionCodeWords)用来确定指定码字数的最佳列和行。
其中,sourceCodeWords 为代码字数,errorCorrectionCodeWords 为纠错码字数,该函数返回维度对象包含列作为宽度和行作为高度。

private int[] determineDimensions(int sourceCodeWords, int errorCorrectionCodeWords) throws WriterException { float ratio = 0.0f; int[] dimension = null; for (int cols = minCols; cols <= maxCols; cols++) { int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, cols); if (rows < minRows) { break; } if (rows > maxRows) { continue; } float newRatio = ((float) (17 * cols + 69) * DEFAULT_MODULE_WIDTH) / (rows * HEIGHT); // 如果以前的比率更接近首选比率,则忽略 if (dimension != null && Math.abs(newRatio - PREFERRED_RATIO) > Math.abs(ratio - PREFERRED_RATIO)) { continue; } ratio = newRatio; dimension = new int[] {cols, rows}; } // 处理最小值大于必要值时的情况 if (dimension == null) { int rows = calculateNumberOfRows(sourceCodeWords, errorCorrectionCodeWords, minCols); if (rows < minRows) { dimension = new int[]{minCols, minRows}; } } if (dimension == null) { throw new WriterException("Unable to fit message in columns"); } return dimension; } 参考资料:

PDF417二维条码详解

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。