type
Post
status
Published
date
Nov 18, 2024
slug
summary
tags
开发
工具
category
技术分享
icon
password
0、讲在开头1、原理1.1、介绍1.2、关键词解释版本信息常用编码模式纠错码转换为掩码图案一些示例2、ZXing库2.1、添加依赖2.2、生成二维码2.3、生成条形码2.4、生成带logo的二维码2.5、读取二维码/条形码3、参考
0、讲在开头
在数字化时代,二维码已经成为了信息交流的一种常见方式。
实际上二维码在1994年的时候就已经诞生了,由Denso公司研制而成,只是那个时候使用范围还不是很大。
早期的二维码由于很容易通过技术方式进行伪造,因此很少有企业愿意去使用他,随着技术的不断迭代和更新,二维码的安全性更进一步得到了提升,从而使得更多的企业愿意使用这项新技术,例如当下的移动支付,还有微信互推,扫码出行等等,极大的方便了网民们的购物、社交和出行!
1、原理
二维码本质上是对字符串的编码规则,最终转换成二进制串。
1.1、介绍
QRCode:Quick Response Code;全称为快速响应矩阵图码

- 定位图案
- 位置探测图案:用于标记二维码矩形的大小;用三个定位图案即可标识并确定一个二维码矩形的位置和方向了;
- 位置探测图形分隔符:用白边框将定位图案与其他区域区分;
- 定位图案:用于定位,二维码如果尺寸过大,扫描时容易畸变,时序图案的作用就是防止扫描时畸变的产生;
- 校正图形:只有在 Version 2 及其以上才会需要;
- 功能数据
- 格式信息:存在于所有尺寸中,存放格式化数据;
- 版本信息:用于 Version 7 以上,需要预留两块 3×6 的区域存放部分版本信息;
- 数据内容(剩余部分)
- 数据码;
- 纠错码;
1.2、关键词解释
版本信息
- 二维码一共有
40个尺寸(也可以称为版本、Version)。Version 1是21 x 21的矩阵,Version 2是25 x 25的矩阵。每增加一个version,长宽就增加 4,公式是:(V - 1) * 4 + 21
- 最高版本是
40,所以是177 x 177的正方形,单纯存储数字的话,可以存 7089 个;只存大写字母的话,可以存大约 4k 个,大约500个汉字
二维码可能会用光么?会
一个2x2的四宫格可以有 2^4=16种形式。

例如微信二维码25x25,每一排有 25 个方块,共 25 列,除去定位用的方块和冗余纠错的方块等,还剩下478 个方块。按照二进制,每个方块只有黑或白两种选择,所以 478 个小方块理论上一共可以组合2^478=780437137578998057845399307448291576437149535666242787714789239906342934704941405030076525765872992789956732780351655723861993919822071326572544 个二维码。
常用编码模式
- 数字编码(
Numeric Mode): 只支持数字 0~9 的编码
- 字符编码(
Alphanumeric Mode):支持包含数字、大写的A-Z(不包含小写)、以及$ % * + – . / :和空格
- 日文编码(
Kanji Mode): 也可以用于中文编码,只能支持0x81400x9FFC、0xE0400xEBBF的字符
- …
示例
…
纠错码
为什么二维码有残缺也能扫出来,以及如何保证扫描结果的正确性?

- 纠错级别越高,恢复能力越强,代价是能存储的有效数据越少,因为纠错码的占比会越高。
- 纠错方法采用的是里德所罗门码(Reed-Solomon Error correction),该算法运用比较广泛,在二维码中,为了抵抗扫描错误或污点,在磁盘中,为了抵抗媒体碎片的丢失,在高级存储系统中,比如谷歌的
gfs和bigtable,为了抵抗数据丢失。(网络协议中的差错控制)
转换为掩码图案
- 为什么二维码黑白块看起来那么均匀?没有连续的 1/0 块吗?
- 对数据区再进行 Masking 操作,也就是做 XOR 操作


一些示例
2、ZXing库
在 Java 生态体系里面,操作二维码的开源项目很多,如 SwetakeQRCode、BarCode4j、Zxing 等等。
介绍下简单易用的 google 公司的 ZXing,ZXing 不仅使用方便,而且可以还操作条形码或者二维码等。
ZXing,全名为"Zebra Crossing",是一个开源的Java库,用于二维码的生成和解析。它是一个强大的工具,可以用于生成QR码以及解析包括QR码在内的多种二维码格式。ZXing提供了多种编程语言的API,使开发者能够轻松集成二维码功能到他们的应用中。它支持多种平台,包括Android、iOS、Java等。除了QR码,ZXing还支持解析其他一维码和二维码,例如EAN、UPC、DataMatrix等。
zxing
zxing • Updated May 28, 2025
2.1、添加依赖
2.2、生成二维码
在上面的代码中,
generateQRCode方法接受四个参数:data:要存储在QR码中的数据,可以是文本、URL等。
width:QR码的宽度(像素)。
height:QR码的高度(像素)。
filePath:生成的QR码文件的保存路径。
方法使用ZXing库的
MultiFormatWriter来生成QR码,并将QR码保存到指定路径的文件中。确保根据需求修改这些参数以生成你想要的QR码。
或者生成后用Base64编码
2.3、生成条形码

2.4、生成带logo的二维码

2.5、读取二维码/条形码

