2021SC@SDUSC Zxing开源代码(十三)Aztec二维码(二)
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二维码(二)相关推荐
- 2021SC@SDUSC Zxing开源代码(二)CaptureActivity代码分析-生命周期函数
文章目录 前言 一.Android基础知识 1. Android 基本组件 2. SurfaceView .Surface与SurfaceHolder 3. Activity 生命周期 4. Andr ...
- 2021SC@SDUSC Zxing开源代码(十七)Zxing代码解析——一维码
2021SC@SDUSC 目录 Code 39 Code 93 Code 128 Codabar ITF 参考资料 前言:本篇博客主要介绍一维码. Code 39 Code39是条形码的一种,也被称为 ...
- 分享6:绘制二维码/二维条码(java版)
最近客户抽筋了,不想要我们现有的二维码,转而采用二维条码.(这之前二维码也不是我做的)既然是甲方bb提出的,老板又安排到到我手上了,那么我就得心(一)甘(脸)情(苦)愿(逼)的默默解决呗. 二维码/二 ...
- PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)
PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001 至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...
- python之有趣的二维码-----二维码表白记
" 如何使用二维码进行表白-一键制作二维码" 二维码在我们现在生活中随处可见,因为一次突发奇想,那我们可不可以制作一个自己的二维码呢!然后让女朋友去扫描一下----嘿嘿嘿--不行, ...
- vue 在线生成二维码 二维码生成背景下载
安装 引用 3.注入 app.vue 这里只是生成二维码 生成二维码 js 这里是需要二维码 并且与另一张合成一张image的! 上代码
- Swift开发小技巧--扫描二维码,二维码的描边与锁定,设置扫描范围,二维码的生成(高清,无码,你懂得!)...
二维码的扫描,二维码的锁定与描边,二维码的扫描范围,二维码的生成(高清,无码,你懂得!),识别相册中的二维码 扫描二维码用到的三个重要对象的关系,如图: 1.懒加载各种类 // MARK: - 懒加载 ...
- 灵猫二维码 - 二维码中间加图片的方法
正常生成的二维码都是不带图标的,但是很多时候我们都需要在二维码中间添加上我们自己的图标,这个时候我们就可以使用灵猫二维码来进行操作了! 使用教程: 1.打开灵猫二维码:http://lmewm.mai ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人 ...
最新文章
- 第一个Mybatis程序示例 Mybatis简介(一)
- 5月Web服务器份额:Microsoft亚军 份额涨1.05%
- c# 过滤HTML代码 源代码,案例 下载
- How to correctly encode .mp4 files for streaming
- movielens推荐系统_基于内容推荐(二)
- Intel 64/x86_64/IA-32/x86处理器 - 指令格式(10/E) - 特殊指令格式(AVX AVX-512)
- yii2 beta版 执行流程
- matlab 带通滤波器_这就够了?一阶高通数字滤波器
- 【软件需求工程与建模】13组组队项目选题介绍及项目计划安排
- 底部版权html5代码,版权设置底部-网页底部版权信息怎么修改?
- Theano简单入门(三)
- Iaas、Paas、Saas都是什么意思?
- Flutter 环境配置
- 自定义provider
- Mob研究院 |2019互联网医疗行业洞察
- java写excel
- ROP(Return Oriented Programming)原理解析
- h5 canvas html 合成,图片合成以及canvas的应用
- P2PSIP 技术专业博客
- 计算机应用基础十分钟说课,计算机应用基础说课稿.ppt