2021SC@SDUSC

目录

  • 一、Aztec二维码简介
    • 1.1 简介
    • 1.2 Aztec码的结构
    • 1.3 编码步骤
    • 1.4 字符集
  • 二、AztecWriter
  • 三、AztecCode
  • 四、Token
    • 4.1 SimpleToken
    • 4.2 BinaryShiftToken
  • 参考文献

前言:本篇博客简单介绍了Aztec相关知识,以及编码步骤过程。


一、Aztec二维码简介

1.1 简介

Aztec码也称阿兹特克码,是一种回形嵌套式的二维条码,可以对多达3000个字符进行编码。由于Aztec码的名称源自中心图案与阿兹特克金字塔相似,因此不需要边缘留白(静区),Aztec码比其他矩阵条码使用更少的空间。

Aztec Code是1995年,由Hand HeldProducts公司的Dr. Andrew Longacre设计。它是一种高容量的二维条形码格式。它可以对ASCII和扩展ASCII码进行编码。当使用最高容量和25%的纠错级别的時候,Aztec可以对3000个字符或者3750个数字进行编码。

Aztec的矩阵大小在15 * 15和151 * 151之间变化。每个最小单位非黑即白。它独特的位于正中的模式识别标志和安置算法使Aztec看起来像个旋涡一样。

Aztec打印解决方案允许用户选择大小和纠错级别。一共有36中不同的格式供选择,此外还有19种纠错级别可供选择,默认纠错级别是5级23%。高纠错级别意味着更少的数据容量和更小的误码机会。

1.2 Aztec码的结构

该种符号构筑在方形网格上,其中心有一个“牛眼”图案用以该码,数据围绕该牛眼图案做同心方形环状编码。中心的“牛眼”为99或1313像素,并在周围的一行像素编码基本编码参数,产生一个1111或1515的核心。而数据以层,每个层包含2环像素,总像素形成1515、1919、23*23等。

核心的边角存在方向标记,以支持图案被旋转或镜像时读取代码。解码从有三个像素的边角开始,然后顺时针到两个像素、一个像素、零个像素的边角。在中心的核心编码载有尺寸信息,所以不需要其他一些条码所需要的空白“静区”来标记代码边缘。

1.3 编码步骤

1.将源消息转换为字符串比特

2.计算必要的符号大小和模式消息,用以决定Reed-Solomon码字大小

3.对消息比特补足为Reed-Solomon码字

4.消息填充到码字边界

5.追加检查码字

6.围绕核心以螺旋形式排列完整信息

1.4 字符集

所有8位的值都可编码,另外加上两个转义代码

默认情况下,0-127的码遵循ANSI*3.4(ASCII)解释,128-255遵循ISO 8859-1:Latin AIphabet No.1解释,这对应ECI 000003。

二、AztecWriter

与QR码和DM码类似,我们先来分析一下编码类AztecWriter。
它继承自父类Writer,并重写了encode方法:

@Overridepublic BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType,?> hints) {Charset charset = null; // 默认情况下,不要添加任何ECI代码int eccPercent = Encoder.DEFAULT_EC_PERCENT;int layers = Encoder.DEFAULT_AZTEC_LAYERS;if (hints != null) {if (hints.containsKey(EncodeHintType.CHARACTER_SET)) {charset = Charset.forName(hints.get(EncodeHintType.CHARACTER_SET).toString());}if (hints.containsKey(EncodeHintType.ERROR_CORRECTION)) {eccPercent = Integer.parseInt(hints.get(EncodeHintType.ERROR_CORRECTION).toString());}if (hints.containsKey(EncodeHintType.AZTEC_LAYERS)) {layers = Integer.parseInt(hints.get(EncodeHintType.AZTEC_LAYERS).toString());}}return encode(contents, format, width, height, charset, eccPercent, layers);}

除此之外,还有一个静态encode方法。

private static BitMatrix encode(String contents, BarcodeFormat format,int width, int height,Charset charset, int eccPercent, int layers) {if (format != BarcodeFormat.AZTEC) {throw new IllegalArgumentException("Can only encode AZTEC, but got " + format);}AztecCode aztec = Encoder.encode(contents, eccPercent, layers, charset);return renderResult(aztec, width, height);}private static BitMatrix renderResult(AztecCode code, int width, int height) {BitMatrix input = code.getMatrix();if (input == null) {throw new IllegalStateException();}int inputWidth = input.getWidth();int inputHeight = input.getHeight();int outputWidth = Math.max(width, inputWidth);int outputHeight = Math.max(height, inputHeight);int multiple = Math.min(outputWidth / inputWidth, outputHeight / inputHeight);int leftPadding = (outputWidth - (inputWidth * multiple)) / 2;int topPadding = (outputHeight - (inputHeight * multiple)) / 2;BitMatrix output = new BitMatrix(outputWidth, outputHeight);for (int inputY = 0, outputY = topPadding; inputY < inputHeight; inputY++, outputY += multiple) {// 写入条形码此行的内容for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) {if (input.get(inputX, inputY)) {output.setRegion(outputX, outputY, multiple, multiple);}}}return output;}

三、AztecCode

AztecCode类用来表示Aztec二维码,上面AztecWriter有调用它。
此类就是一个简单的构造类,有以下五个成员变量:

  private boolean compact;private int size;private int layers;private int codeWords;private BitMatrix matrix;

分别表示:
compact:如果是紧凑型而不是全模式为真,反之为假;
size:大小(以像素为单位,宽度和高度)
layers:级别数
codeWords:数据码字的数目
matrix:二维码符号图像

四、Token

Token是一个抽象类,SimpleToken和BinaryShiftToken都继承自Token。

abstract class Token {static final Token EMPTY = new SimpleToken(null, 0, 0);private final Token previous;Token(Token previous) {this.previous = previous;}final Token getPrevious() {return previous;}final Token add(int value, int bitCount) {return new SimpleToken(this, value, bitCount);}final Token addBinaryShift(int start, int byteCount) {return new BinaryShiftToken(this, start, byteCount);}abstract void appendTo(BitArray bitArray, byte[] text);
}

4.1 SimpleToken

SimpleToken对于普通字而言的。

final class SimpleToken extends Token {private final short value;  // 指示值private final short bitCount;  // 位计数SimpleToken(Token previous, int value, int bitCount) {super(previous);this.value = (short) value;this.bitCount = (short) bitCount;}@Overridevoid appendTo(BitArray bitArray, byte[] text) {bitArray.appendBits(value, bitCount);}@Overridepublic String toString() {int value = this.value & ((1 << bitCount) - 1);value |= 1 << bitCount;return '<' + Integer.toBinaryString(value | (1 << bitCount)).substring(1) + '>';}}

4.2 BinaryShiftToken

BinaryShiftToken是与二进制有关的。

final class BinaryShiftToken extends Token {private final int binaryShiftStart;private final int binaryShiftByteCount;BinaryShiftToken(Token previous,int binaryShiftStart,int binaryShiftByteCount) {super(previous);this.binaryShiftStart = binaryShiftStart;this.binaryShiftByteCount = binaryShiftByteCount;}@Overridepublic void appendTo(BitArray bitArray, byte[] text) {int bsbc = binaryShiftByteCount;for (int i = 0; i < bsbc; i++) {if (i == 0 || (i == 31 && bsbc <= 62)) {// 在第一个字符前加一个头,当总字节码<=62时,在第31个字符前加一个头bitArray.appendBits(31, 5);  // 二进制移位if (bsbc > 62) {bitArray.appendBits(bsbc - 31, 16);} else if (i == 0) {// 1<=二进制移位字节码<=62bitArray.appendBits(Math.min(bsbc, 31), 5);} else {// 32<=binaryShiftCount<=62,i==31bitArray.appendBits(bsbc - 31, 5);}}bitArray.appendBits(text[binaryShiftStart + i], 8);}}@Overridepublic String toString() {return "<" + binaryShiftStart + "::" + (binaryShiftStart + binaryShiftByteCount - 1) + '>';}}

参考文献

有关Aztec码详解

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. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

  4. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(三)——Internal

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(三)--Internal 前言 Internal 1.Converter 2.EMemoryMode 3.Wi ...

  5. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(四)——ModulesPanels

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(四)--Modules&Panels 前言 Modules Canvas Panels APanel ...

  6. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(五)——Plugins

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(五)--Plugins 前言 DataDispatcher DDSource DDTarget IPlugin ...

  7. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(六)——SceneSystem

    <2021SC@SDUSC>[Overload游戏引擎]OvCore源码模块分析(六)--SceneSystem 前言 SceneSystem Scene SceneManager 总结 ...

  8. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(一)——APIComponent

    <2021SC@SDUSC>[Overload游戏引擎]OvCore源码模块分析(一)--API&Component 前言 API Component Behaviour CAmb ...

  9. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(一)——Core

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(一) 文章目录 前言 OvUI的模块结构 源码分析 1.Core模块 (1)UIManger的构造函数和析构函 ...

  10. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(六)——Widgets

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(六)--Widgets Button Button namespace OvUI::Widgets::Butt ...

最新文章

  1. 读书笔记-PowerShell实战指南(第三版)
  2. [BTS]BizTalk学习之Functoid篇(ID Cross-References)
  3. MATLAB移植C的小结
  4. python多进程打印输出_多进程打印日志
  5. 智伴机器人课文跟读哪里有_火了!智伴机器人竟然出现在2018年高考试卷
  6. 聚宝盆,只要你上网就可以挣钱
  7. CTF-杂项题-伪加密
  8. filename: core/loader.php,使用第三方包后出现的这个错误,你们都遇到过吗?
  9. [2014.3.23]cse::lab2::partD 简明攻略
  10. django 学习-13 Django文件上传
  11. 跳槽到新公司,我直接让项目的性能提升了一半。。。
  12. python爬虫抓文章_公众号文章抓取(python爬虫如何抓取微信公众号文章)
  13. Android, App常用图标尺寸规范
  14. 基于matlab实现双路音频信号的AM调制与解调
  15. gbk2312拼音表 按词频排好序的
  16. 将任意窗口固定到桌面最前端
  17. 我国超级计算机第一名是,中国蝉联超级计算机冠军,美国跌出前三
  18. html5点赞按钮特效,jquery仿直播app按钮点赞动画效果
  19. Latex之参考文献字体大小
  20. 【Redis】Redis布隆过滤器工作原理与实战(Redis专栏启动)

热门文章

  1. conda 解决An HTTP error occurred when trying to retrieve this URL.
  2. OSChina 周一乱弹 —— 程序猿到底是多有才?
  3. html ol标签用罗马数字,HTML重点标签总结
  4. 163邮箱给gmail邮箱发邮件,gmail邮箱收不到
  5. 中间件系列六 RabbitMQ之Topic exchange 用法
  6. linux桌面下雪,分享|Linux/Unix 桌面趣事:让桌面下雪
  7. 关于ps中钢笔工具的介绍
  8. solidity智能合约[4]-pure与view剖析
  9. 计算机word水印在哪,word中如何加入水印的两种方法
  10. 六类水晶头的制作方法