Generating QR Code in Java

2025年5月3日 | 阅读 6 分钟

QR 码是 快速响应码 (Quick Response code) 的缩写。它是条形码的替代品,或者说它是一种二维条形码。它包含小方块的矩阵,信息存储在其中。它的工作方式与条形码相同。它可以被成像设备读取。如今,它在各个领域得到了广泛应用,例如地理位置、产品、车辆跟踪等。在本节中,我们将学习如何使用 ZXing 库在 Java 中生成和读取 QR 码。

QR 码

由白色背景上的黑色方块组成的网格排列,可被成像设备读取,称为QR 码QR 码的优点是智能手机可以扫描它。我们无需携带任何手持设备进行扫描。它用于存储文本、网页、URL 等信息。它使用以下四种标准化编码模式:

  • 数字
  • 字母数字
  • 字节/二进制
  • 日文 (日文假名)

这些标准编码模式可以有效存储数据。快速响应系统因其快速的可读性和比标准 UPC 条形码更大的存储容量而在汽车行业之外流行起来。

QR 码如何工作?

QR 码由包含编码数据的模块(黑白方块)组成。模块按行和列排列,称为数据矩阵。数据位的放置从右下角开始,向上移动,并在到达顶部时改变位置。

我们通过成像设备(如摄像头)扫描 QR 码。扫描后,它使用Reed-Solomon 纠错码处理 QR 码,直到图像被解释。之后,数据从存储在代码的水平和垂直分量的模式中提取出来。下图描述了 QR 码的结构及其元素。

QR 码组件

QR 码主要有两个组件:功能模式和编码区域。这些组件进一步细分为小组件。下图描绘了 QR 码的组件。

Generating QR Code in Java

下表描述了每个组件及其功能。

组成部分组件部分描述
静止区它是 QR 码的边界。 QR 码周围的空白区域代表静止区。
功能模式定位模式它也称为查找器模式定位标记。它用于查找 QR 码的边缘。
时间模式它帮助扫描仪识别行和列的位置。 QR 码中的第六行和列专门用于时间模式。
分隔符它将数据与查找器模式分隔开。
对齐模式它帮助扫描仪识别用于对齐的参考点
编码区域格式信息它帮助扫描仪识别内容类型,例如文本、URL 等。它包含两部分数据:纠错级别掩码模式
版本信息它帮助扫描仪识别 QR 码的版本号。
数据模块它帮助扫描仪解码创建者输入的数据。

纠错级别

QR 码即使在一定程度损坏(高达 30%)的情况下也可以被扫描。Reed-Solomon 纠错算法使这成为可能。需要注意的是,如果我们添加纠错,它会增加 QR 码中的数据块数量。因此,我们需要根据要求调整纠错级别。有四个纠错级别:

纠错级别及其能力
级别纠错百分比
低 (L)7%
中 (M)15%
四分位 (Q)25%
高 (H)30%

以下 QR 码代表7%的纠错能力。

Generating QR Code in Java

QR 码可以存储多少数据?

QR 码的数据存储容量取决于以下三项:

  • 数据类型(模式或输入字符集)
  • 版本(1 至 40 种不同大小的 QR)
  • 纠错

版本表示符号的尺寸(即每边 4 × 版本号 + 17 个点)。

最大字符存储容量
编码模式最大字符数每字符位数可能的字符和默认编码
仅数字7,08931⁄30, 1, 2, 3, 4, 5, 6, 7, 8, 9
字母数字4,29651⁄20-9、A-Z(仅大写)、空格、$、% 、* 、+ 、- 、. 、/ 、
二进制/字节2,9538ISO 8859-1
日文/假名1,81713Shift JIS X 0208

注意:随着版本号的变化,行数和列数也随之变化。因此,存储的信息量更大。还值得注意的是,QR 码包含相等数量的行和列。行数和列数取决于版本号。

生成 QR 码

要在 Java 中生成 QR 码,我们需要使用一个名为ZXing (Zebra Crossing) 的第三方库。它是一个流行的 API,允许我们处理 QR 码。借助该库,我们可以轻松生成和读取 QR 码。在继续 Java 程序之前,我们需要将 ZXing 库添加到项目中。我们可以从官方网站 下载

下载后,将其添加到类路径中。或者在 pom.xml 文件中添加以下依赖项。

让我们创建一个生成 QR 码的 Java 程序。

GenerateQrCode.java

输出

Generating QR Code in Java

当我们运行上面的 Java 程序时,它会在指定的目录中生成以下 QR 码。

Generating QR Code in Java

读取 QR 码

让我们通过一个我们上面生成的 Java 程序来读取 QR 码。

ReadQrCode.java

输出

Generating QR Code in Java

我们看到我们得到了与上一个程序中存储在 QR 码中的相同数据。