2021SC@SDUSC

目录

  • Encoder
    • 1.1 encode1
    • 1.2 encode2
    • 1.3 encode3
    • 1.4 encode4
    • 1.5 encode5
    • 1.6 encode6

前言:本篇博客继续对Aztec二维码编码进行分析。


Encoder

Encoder用来生成Aztec二维条形码。其中,最重要的是encode方法,此类一共重载了6个encode方法,最为重要的为第六个。

1.1 encode1

将给定字符串内容编码为Aztec符号(无ECI代码)。
data :输入数据字符串;必须按照ISO/IEC 8859-1(Latin-1)进行编码。
返回带有元数据的Aztec符号矩阵。

public static AztecCode encode(String data) {return encode(data.getBytes(StandardCharsets.ISO_8859_1));}

1.2 encode2

将给定字符串内容编码为Aztec符号(无ECI代码)。
data:输入数据字符串;必须按照ISO/IEC 8859-1(Latin-1)进行编码。
minECCPercent :错误检查字的最小百分比(根据ISO/IEC 24778:2008,建议至少23%+3个单词)。
userSpecifiedLayers:如果为非零,层数则为用户的指定值。
返回带有元数据的Aztec符号矩阵。

  public static AztecCode encode(String data, int minECCPercent, int userSpecifiedLayers) {return encode(data.getBytes(StandardCharsets.ISO_8859_1), minECCPercent, userSpecifiedLayers, null);}

1.3 encode3

将给定字符串内容编码为Aztec符号。
data:输入数据字符串。
minECCPercent :错误检查字的最小百分比(根据ISO/IEC 24778:2008,建议至少23%+3个单词)。
userSpecifiedLayers:如果为非零,层数则为用户的指定值。
charset:使用ECI对字符串进行编码的字符集;如果为空,则不会插入ECI代码,字符串必须可编码为ISO/IEC 8859-1(Latin-1),这是符号的默认编码。
返回带有元数据的Aztec符号矩阵。

  public static AztecCode encode(String data, int minECCPercent, int userSpecifiedLayers, Charset charset) {byte[] bytes = data.getBytes(null != charset ? charset : StandardCharsets.ISO_8859_1);return encode(bytes, minECCPercent, userSpecifiedLayers, charset);}

1.4 encode4

将给定的二进制内容编码为Aztec符号(无ECI代码)。
data:输入数据字符串。
返回带有元数据的Aztec符号矩阵。

public static AztecCode encode(byte[] data) {return encode(data, DEFAULT_EC_PERCENT, DEFAULT_AZTEC_LAYERS, null);}

1.5 encode5

将给定的二进制内容编码为Aztec符号(无ECI代码)。
data:输入数据字符串。
minECCPercent :错误检查字的最小百分比(根据ISO/IEC 24778:2008,建议至少23%+3个单词)。
userSpecifiedLayers:如果为非零,层数则为用户的指定值。
返回带有元数据的Aztec符号矩阵。

public static AztecCode encode(byte[] data, int minECCPercent, int userSpecifiedLayers) {return encode(data, minECCPercent, userSpecifiedLayers, null);}

1.6 encode6

将给定字符串内容编码为Aztec符号。
data:输入数据字符串。
minECCPercent :错误检查字的最小百分比(根据ISO/IEC 24778:2008,建议至少23%+3个单词)。
userSpecifiedLayers:如果为非零,层数则为用户的指定值。
charset:使用ECI标记的字符集;如果为空,则不会插入ECI代码,读卡器将采用ISO/IEC 8859-1的默认编码。
返回带有元数据的Aztec符号矩阵。

public static AztecCode encode(byte[] data, int minECCPercent, int userSpecifiedLayers, Charset charset) {// 省略。。。}

填充:

// 填充位并选择符号大小int eccBits = bits.getSize() * minECCPercent / 100 + 11;int totalSizeBits = bits.getSize() + eccBits;boolean compact;int layers;int totalBitsInLayer;int wordSize;BitArray stuffedBits;if (userSpecifiedLayers != DEFAULT_AZTEC_LAYERS) {compact = userSpecifiedLayers < 0;layers = Math.abs(userSpecifiedLayers);if (layers > (compact ? MAX_NB_BITS_COMPACT : MAX_NB_BITS)) {throw new IllegalArgumentException(String.format("Illegal value %s for layers", userSpecifiedLayers));}totalBitsInLayer = totalBitsInLayer(layers, compact);wordSize = WORD_SIZE[layers];int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize);stuffedBits = stuffBits(bits, wordSize);if (stuffedBits.getSize() + eccBits > usableBitsInLayers) {throw new IllegalArgumentException("Data to large for user specified layer");}if (compact && stuffedBits.getSize() > wordSize * 64) {// 紧凑格式只允许64个数据字,尽管C4可以容纳更多的字throw new IllegalArgumentException("Data to large for user specified layer");}} else {wordSize = 0;stuffedBits = null;// 我们按照Compact1、Compact2、Compact3、Compact4、Normal4等顺序查看可能的表大小,。。。通常不使用i<4的正常值(i),因为紧凑型(i+1)的大小相同,但具有更多数据。for (int i = 0; ; i++) {if (i > MAX_NB_BITS) {throw new IllegalArgumentException("Data too large for an Aztec code");}compact = i <= 3;layers = compact ? i + 1 : i;totalBitsInLayer = totalBitsInLayer(layers, compact);if (totalSizeBits > totalBitsInLayer) {continue;}// 如果这是第一次机会,或者字号已更改,请填充位if (stuffedBits == null || wordSize != WORD_SIZE[layers]) {wordSize = WORD_SIZE[layers];stuffedBits = stuffBits(bits, wordSize);}int usableBitsInLayers = totalBitsInLayer - (totalBitsInLayer % wordSize);if (compact && stuffedBits.getSize() > wordSize * 64) {// 紧凑格式只允许64个数据字,尽管C4可以容纳更多的字continue;}if (stuffedBits.getSize() + eccBits <= usableBitsInLayers) {break;}}}BitArray messageBits = generateCheckWords(stuffedBits, totalBitsInLayer, wordSize);

模式与符号:

    // 生成模式消息int messageSizeInWords = stuffedBits.getSize() / wordSize;BitArray modeMessage = generateModeMessage(compact, layers, messageSizeInWords);// 分配符号int baseMatrixSize = (compact ? 11 : 14) + layers * 4; // not including alignment linesint[] alignmentMap = new int[baseMatrixSize];int matrixSize;if (compact) {// 在压缩模式下没有对齐标记,alignmentMap是无操作的matrixSize = baseMatrixSize;for (int i = 0; i < alignmentMap.length; i++) {alignmentMap[i] = i;}} else {matrixSize = baseMatrixSize + 1 + 2 * ((baseMatrixSize / 2 - 1) / 15);int origCenter = baseMatrixSize / 2;int center = matrixSize / 2;for (int i = 0; i < origCenter; i++) {int newOffset = i + i / 15;alignmentMap[origCenter - i - 1] = center - newOffset - 1;alignmentMap[origCenter + i] = center + newOffset + 1;}}BitMatrix matrix = new BitMatrix(matrixSize);}

绘制部分:

// 绘制数据位for (int i = 0, rowOffset = 0; i < layers; i++) {int rowSize = (layers - i) * 4 + (compact ? 9 : 12);for (int j = 0; j < rowSize; j++) {int columnOffset = j * 2;for (int k = 0; k < 2; k++) {if (messageBits.get(rowOffset + columnOffset + k)) {matrix.set(alignmentMap[i * 2 + k], alignmentMap[i * 2 + j]);}if (messageBits.get(rowOffset + rowSize * 2 + columnOffset + k)) {matrix.set(alignmentMap[i * 2 + j], alignmentMap[baseMatrixSize - 1 - i * 2 - k]);}if (messageBits.get(rowOffset + rowSize * 4 + columnOffset + k)) {matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - k], alignmentMap[baseMatrixSize - 1 - i * 2 - j]);}if (messageBits.get(rowOffset + rowSize * 6 + columnOffset + k)) {matrix.set(alignmentMap[baseMatrixSize - 1 - i * 2 - j], alignmentMap[i * 2 + k]);}}}rowOffset += rowSize * 8;}// 绘制模式消息drawModeMessage(matrix, compact, matrixSize, modeMessage);// 画对齐标记if (compact) {drawBullsEye(matrix, matrixSize / 2, 5);} else {drawBullsEye(matrix, matrixSize / 2, 7);for (int i = 0, j = 0; i < baseMatrixSize / 2 - 1; i += 15, j += 16) {for (int k = (matrixSize / 2) & 1; k < matrixSize; k += 2) {matrix.set(matrixSize / 2 - j, k);matrix.set(matrixSize / 2 + j, k);matrix.set(k, matrixSize / 2 - j);matrix.set(k, matrixSize / 2 + j);}   }

2021SC@SDUSC Zxing开源代码(十三)Aztec二维码(二)相关推荐

  1. 2021SC@SDUSC Zxing开源代码(二)CaptureActivity代码分析-生命周期函数

    文章目录 前言 一.Android基础知识 1. Android 基本组件 2. SurfaceView .Surface与SurfaceHolder 3. Activity 生命周期 4. Andr ...

  2. 2021SC@SDUSC Zxing开源代码(十七)Zxing代码解析——一维码

    2021SC@SDUSC 目录 Code 39 Code 93 Code 128 Codabar ITF 参考资料 前言:本篇博客主要介绍一维码. Code 39 Code39是条形码的一种,也被称为 ...

  3. 分享6:绘制二维码/二维条码(java版)

    最近客户抽筋了,不想要我们现有的二维码,转而采用二维条码.(这之前二维码也不是我做的)既然是甲方bb提出的,老板又安排到到我手上了,那么我就得心(一)甘(脸)情(苦)愿(逼)的默默解决呗. 二维码/二 ...

  4. PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)

    PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001  至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...

  5. python之有趣的二维码-----二维码表白记

    " 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...

  6. vue 在线生成二维码 二维码生成背景下载

    安装 引用 3.注入 app.vue 这里只是生成二维码 生成二维码 js 这里是需要二维码 并且与另一张合成一张image的! 上代码

  7. Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)...

    二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...

  8. 灵猫二维码 - 二维码中间加图片的方法

    正常生成的二维码都是不带图标的,但是很多时候我们都需要在二维码中间添加上我们自己的图标,这个时候我们就可以使用灵猫二维码来进行操作了! 使用教程: 1.打开灵猫二维码:http://lmewm.mai ...

  9. (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...

  10. ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

    首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人 ...

最新文章

  1. 第一个Mybatis程序示例 Mybatis简介(一)
  2. 5月Web服务器份额:Microsoft亚军 份额涨1.05%
  3. c# 过滤HTML代码 源代码,案例 下载
  4. How to correctly encode .mp4 files for streaming
  5. movielens推荐系统_基于内容推荐(二)
  6. Intel 64/x86_64/IA-32/x86处理器 - 指令格式(10/E) - 特殊指令格式(AVX AVX-512)
  7. yii2 beta版 执行流程
  8. matlab 带通滤波器_这就够了?一阶高通数字滤波器
  9. 【软件需求工程与建模】13组组队项目选题介绍及项目计划安排
  10. 底部版权html5代码,版权设置底部-网页底部版权信息怎么修改?
  11. Theano简单入门(三)
  12. Iaas、Paas、Saas都是什么意思?
  13. Flutter 环境配置
  14. 自定义provider
  15. Mob研究院 |2019互联网医疗行业洞察
  16. java写excel
  17. ROP(Return Oriented Programming)原理解析
  18. h5 canvas html 合成,图片合成以及canvas的应用
  19. P2PSIP 技术专业博客
  20. 计算机应用基础十分钟说课,计算机应用基础说课稿.ppt

热门文章

  1. h61 nvme硬盘_免装系统!机械硬盘系统迁移至固态硬盘技巧
  2. App开发国内常用的应用市场
  3. 利用antd进行轻量级表单开发,获取验证码
  4. 手机用USB连接电脑宽带上网(只需轻松3步即可上网)
  5. 航飞影像的GPS坐标导出、修改、写入(EXIF信息)
  6. Spring核心方法 refresh 解析
  7. ftp服务器上传显示550,ftp上传文件服务器报550
  8. 找不到硬盘分区怎么办
  9. PS之制作圆角的白色边框图和白色底图
  10. java正则表达式是什么6_进阶Java编程(6)正则表达式