2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)

2023-10-29

2021SC@SDUSC


前言:本篇博客继续介绍PDF417二维码的编码步骤过程。


一、BarcodeMatrix

BarcodeMatrix类以易于访问的格式保存条形码的所有信息。
包括以下四个成员变量,分别表示二维码相应的矩阵、当前行、二维码的高和宽。

  private final BarcodeRow[] matrix;
  private int currentRow;
  private final int height;
  private final int width;

其构造函数为:
height和width分别为矩阵的高度(行)和宽度(列)。

  BarcodeMatrix(int height, int width) {
    matrix = new BarcodeRow[height];
    //将数组初始化为正确的宽度
    for (int i = 0, matrixLength = matrix.length; i < matrixLength; i++) {
      matrix[i] = new BarcodeRow((width + 4) * 17 + 1);
    }
    this.width = width * 17;
    this.height = height;
    this.currentRow = -1;
  }

二、BarcodeRow

BarcodeRow类用来创建条形码的行。

其成员变量有:

  private final byte[] row;
  private int currentLocation;

主要方法有:
其中,x表示在条中的位置;black为一个布尔值,如果条为黑色,则为真;如果条为白色,则为假;width表示条宽为多少个点。

set(int x, boolean black) 方法用来设置栏中的特定位置;addBar(boolean black, int width) 用来添加条。

  private void set(int x, boolean black) {
    row[x] = (byte) (black ? 1 : 0);
  }

  void addBar(boolean black, int width) {
    for (int ii = 0; ii < width; ii++) {
      set(currentLocation++, black);
    }
  }

getScaledRow(int scale)方法用于缩放行,scale 表示缩放图像的大小,必须大于或等于1;此函数返回缩放的行。

  byte[] getScaledRow(int scale) {
    byte[] output = new byte[row.length * scale];
    for (int i = 0; i < output.length; i++) {
      output[i] = row[i / scale];
    }
    return output;
  }

三、Compaction

Compaction类是一个枚举类,用来表示可能的PDF417条码压缩类型。
一共有四种类型: AUTO、TEXT、BYTE、NUMERIC

public enum Compaction {
  AUTO,
  TEXT,
  BYTE,
  NUMERIC
}

四、Dimensions

Dimensions是数据对象,用于指定PDF417条形码的最小行数和最大列数。

四个成员变量分别表示最小列数、最大列数、最小行数、最大行数。

public final class Dimensions {

  private final int minCols;
  private final int maxCols;
  private final int minRows;
  private final int maxRows;

  public Dimensions(int minCols, int maxCols, int minRows, int maxRows) {
    this.minCols = minCols;
    this.maxCols = maxCols;
    this.minRows = minRows;
    this.maxRows = maxRows;
  }
  public int getMinCols() {return minCols;}
  public int getMaxCols() {return maxCols;}
  public int getMinRows() {return minRows;}
  public int getMaxRows() {return maxRows;}
}

五、PDF417ErrorCorrection

PDF417ErrorCorrection类为PDF417的纠错码,遵循ISO/IEC 15438:2001(E)第4.10章所述算法。

getErrorCorrectionCodewordCount(int errorCorrectionLevel) 用来确定指定纠错级别的纠错码字数。
errorCorrectionLevel 为错误更正级别(0-8);
函数返回为纠错而生成的码字数。

  static int getErrorCorrectionCodewordCount(int errorCorrectionLevel) {
    if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {
      throw new IllegalArgumentException("Error correction level must be between 0 and 8!");
    }
    return 1 << (errorCorrectionLevel + 1);
  }

getRecommendedMinimumErrorCorrectionLevel(int n)函数返回ISO/IEC 15438:2001(E)附录E中所述的建议最小错误纠正水平。
n 为数据码字的数量。

  static int getRecommendedMinimumErrorCorrectionLevel(int n) throws WriterException {
    if (n <= 0) {
      throw new IllegalArgumentException("n must be > 0");
    }
    if (n <= 40) {return 2;}
    if (n <= 160) {return 3;}
    if (n <= 320) {return 4;}
    if (n <= 863) {return 5;}
    throw new WriterException("No recommendation possible");
  }

generateErrorCorrection(CharSequence dataCodewords, int errorCorrectionLevel)函数根据ISO/IEC 15438:2001(E)中的4.10生成纠错码字。
dataCodewords 为数据码字数据码字;errorCorrectionLevel 为错误更正级别(0-8)。

  static String generateErrorCorrection(CharSequence dataCodewords, int errorCorrectionLevel) {
    int k = getErrorCorrectionCodewordCount(errorCorrectionLevel);
    char[] e = new char[k];
    int sld = dataCodewords.length();
    for (int i = 0; i < sld; i++) {
      int t1 = (dataCodewords.charAt(i) + e[e.length - 1]) % 929;
      int t2;
      int t3;
      for (int j = k - 1; j >= 1; j--) {
        t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929;
        t3 = 929 - t2;
        e[j] = (char) ((e[j - 1] + t3) % 929);
      }
      t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929;
      t3 = 929 - t2;
      e[0] = (char) (t3 % 929);
    }
    StringBuilder sb = new StringBuilder(k);
    for (int j = k - 1; j >= 0; j--) {
      if (e[j] != 0) {
        e[j] = (char) (929 - e[j]);
      }
      sb.append(e[j]);
    }
    return sb.toString();
  }

六、PDF417HighLevelEncoder

PDF417HighLevelEncoder类为PDF417的高级编码器。

含有多个成员变量。

成员变量 取值 说明
TEXT_COMPACTION 0 文本压缩代码
BYTE_COMPACTION 1 字节压缩代码
NUMERIC_COMPACTION 2 数字压缩代码
SUBMODE_ALPHA 0 文本压缩子模式Alpha
SUBMODE_LOWER 1 文本压缩子模式下
SUBMODE_MIXED 2 文本压缩子模式混合
SUBMODE_PUNCTUATION 3 文本压缩子模式标点符号
LATCH_TO_TEXT 900 模式锁存到文本压缩模式
LATCH_TO_BYTE_PADDED 901 模式锁存到字节压缩模式(字符数不是6的倍数)
LATCH_TO_NUMERIC 902 模式锁存到数字压缩模式
SHIFT_TO_BYTE 913 模式转换为字节压缩模式
LATCH_TO_BYTE 924 模式锁存到字节压缩模式(字符数为6的倍数)
ECI_USER_DEFINED 925 用户定义扩展信道解释(ECI)的标识符
ECI_GENERAL_PURPOSE 926 通用ECO格式的标识符
ECI_CHARSET 927 代码页字符集的ECI标识符
TEXT_MIXED_RAW 文本压缩混合子模式的原始代码表
TEXT_PUNCTUATION_RAW 文本压缩的原始代码表:标点子模式

成员函数为:

成员函数 说明
encodeHighLevel(String msg, Compaction compaction, Charset encoding) 使用ISO/IEC 15438:2001(E)附录P中描述的算法对PDF417消息执行高级编码。如果已选择字节压缩,则仅使用字节压缩。返回编码消息(字符值范围从0到928)
encodeText(CharSequence msg, int startpos,int count,StringBuilder sb, int initialSubmode) 使用文本压缩对部分信息进行编码。返回此方法结束时的文本子模式
encodeBinary(byte[] bytes, int startpos,int count,int startmode,StringBuilder sb) 使用字节压缩对部分信息进行编码。Unicode字符将使用cp437代码页转换为二进制。返回接收编码的码字。
determineConsecutiveDigitCount(CharSequence msg, int startpos) 确定可使用数字压缩编码的连续字符数。返回请求的字符数。
determineConsecutiveTextCount(CharSequence msg, int startpos) 确定可使用文本压缩编码的连续字符数。返回请求的字符数。
determineConsecutiveBinaryCount(String msg, int startpos, Charset encoding) 确定可使用二进制压缩编码的连续字符数。返回请求的字符数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二) 的相关文章

随机推荐

  • Vue组件生命周期与钩子函数

    组件生命周期 组件 组件是可复用的 Vue 实例 从创建到销毁的过程就是组件的生命周期 是一个时间段 组件生命周期钩子函数 vue3与vue2生命周期钩子函数略有不同 本文以vue2为主 VUE 提供的生命周期钩子函数 会伴随组件的生命周期
  • 超级签具体实现

    签名原理 使用了苹果提供给开发者的Ad Hoc分发通道 把安装设备当做开发设备进行分发 优势 直接分发 安装即可运行 稳定 不会有证书吊销导致的风险 缺点 单开发者账号的iPhone设备数量只有100个 整体架构 设备安装描述文件后 会向服
  • 数据结构(C语言)——单链表

    整体结构如上 看似简单 但第一次用C语言实现还是感觉有点吃力 尤其是特别容易让链表断裂 下面是代码 有链表的增删改查 注 这里E类型是用define将int进行了宏定义 include
  • java 单一登录

    对于一个帐号在同一时间只能一个人登录 可以通过下面的方法实现 1 在用户登录时 把用户添加到一个ArrayList中 2 再次登录时查看ArrayList中有没有该用户 如果ArrayList中已经存在该用户 则阻止其登录 3 当用户退出时
  • 【笔记】三剑客之awk、sed后向引用

    sed后向引用 语法格式 sed r s 1 g file 1 表示获取第一个括号中的内容 sed支持扩展正则需要加r参数 案例1 调用括号中的内容 root ahui echo root sed r s root 1 g root 案例2
  • 计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

    总线是计算机中连接各个功能部件的纽带 是计算机各部件之间进行信息传输的公共通路 总线不只是一组简单的信号传输线 它还是一组协议 他有两大特征 分时 同一总线在同一时刻 只能有一个部件占领总线发送信息 其他部件要发送信息得在该 部件发送完释放
  • 【Echarts】echarts渐变色仪表盘

    echarts渐变色仪表盘 echarts随意一个示例代码 直接点击上方链接 将此段代码放到echarts的示例代码编辑框里 let dataList9 total 85 list name 待处置 value 1501 name 处置中
  • 目标检测发展与综述

    目标检测发展与综述 绪论 在github上的git主hoya012整理了关于目标检测的相关论文 点击此处可获取原文链接GitHub hoya012 deep learning object detection A paper list of
  • curl -u 背后的内容以及和 Django rest framework 的 BasicAuthentication 的呼应

    curl u 的基本介绍 curl 是常用的命令行工具 用来请求 Web 服务器 它的名字就是客户端 client 的 URL 工具的意思 它的功能非常强大 命令行参数多达几十种 如果熟练的话 完全可以取代 Postman 这一类的图形界面
  • libusb编译、测试、使用

    要用到才开始学 啥都不懂 感觉好难受 最近要在ARM Linux嵌入式端集成libusb 刚开始搞 慢慢写 首先是libusb的交叉编译和测试 交叉编译 下载libusb的源码 下载地址 https sourceforge net proj
  • upload-labs1-5

    用浏览器打开upload 第一关 js检查 上传文件会获得提示 把文件后缀改为 jpg png gif 我这里用的是jpg 打开burpsuite在upload上传修改后的文件进行爪包 在burpsuite中修改文件进行回显 第二关 仅判断
  • Java学习笔记(十九)

    Spring Cloud 什么是Spring Cloud Spring cloud 应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 更专注于服务治理 Spring cloud Task 一
  • eix安装_U盘安装原版Windows7

    教程简介 本教程为U盘安装原版Windows 7 我将带领大家学习如何用U盘安装原版的Windows7系统 希望对大家有帮助 在开始安装之前需要了解常见电脑的U盘启动按键都有哪些 请仔细阅读下表 安装步骤 一定要看步骤3 不然造成数据损坏概
  • 爬虫入门第2课:代理池的设计

    爬虫学习知识点及案例篇 汇总 爬虫入门第1课 代理池概述及开发环境 本阶段带大家从代理池的设计开始 学习Python爬虫及项目实战 详情关注上方专栏 1 代理池的工作流程 目标 理解代理池的工作流程 以及 各个模块的作用 内容介绍 代理池的
  • Java-API简析_java.net.InetAddress类(基于 Latest JDK)(浅析源码)

    版权声明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 https blog csdn net m0 69908381 article details 131590559 出自 进步 于辰的博客 因为我发现目前 我对Java API的
  • 模板引擎 template

    1 特性 性能卓越 执行速度通常是Mustache与tmpl的20多倍 性能测试 支持运行时调试 可精确定位异常模板所在的语句 对NodeJS Express友好支持 安全 默认对输出进行转义 在沙箱中运行编译后的代码 Node版本可以安全
  • SQL Server批处理运行时错误的影响

    前言 批处理是同时从应用程序发送到 SQL Server 2005 并得以执行的一组单条或多条 Transact SQL 语句 我们通常认为当一个批处理的多条语句中有一条发生运行时错误 将停止执行批处理中当前语句和它之后的语句 这使得在实际
  • Seq2Seq实战——机器翻译

    基于seq2seq做一个机器翻译 我们将使用PyTorch和TorchText构建一个机器学习模型 从一个序列到另一个序列 将德语到英语翻译成英语 该模型是 Sequence to Sequence Learning with Neural
  • 简单html文件上传带参数

    html的代码如下
  • 2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)

    2021SC SDUSC 目录 一 BarcodeMatrix 二 BarcodeRow 三 Compaction 四 Dimensions 五 PDF417ErrorCorrection 六 PDF417HighLevelEncoder