什么是二维码?
简单来说,二维码就是一种数据的编码方式,和我们熟知的莫尔斯电码是一样的,借助一些方法,我们可以将文本数据转换为二维码,也可以将二维码转换成我们熟悉的文本。
二维码能表示什么类型的数据?
数据都可以用0和1表示,所以二维码理论上可以把任何类型的数据塞进去(甚至是一小段视频),可问题是扫描器能否解析扫描到的数据,而不是把扫描到的数据当成一堆乱码。
目前绝大部分扫描器都会主观的将扫描到的内容转化为文本,因此二维码常用来表示文本数据。
二维码的种类
二维码根据样式可以分为 Data Matrix、MaxiCode、Aztec、QR Code、PDF417、Vericode、Ultracode、Code 49、Code 16K,我们最常见的主要是 QR Code,下面也主要针对QRCode进行分析
什么是QRCode版本?QRCode有多少个版本?
从最直观的角度来讲,QRCode 版本不同,其大小不同。QRCode 有1到40的不同版本(version),每个版本都具备固有的码元结构(码元数)。(码元是指构成QR码的方形黑白点)。
下面是不同版本的二维码:
二维码能表示多少数据?
数据容量取决于 编码方式 + 纠错级别 + 二维码版本,下图为简单示例,即选择 纯数字编码 + 纠错级别为M + 二维码版本为3时,二维码字符容量为101。
完整的表格请见:www.qrcode.com/zh/about/ve…
二维码文本数据格式
之前提到了二维码的识别结果主要是文本,而根据文本格式的不同,扫描器(例如微信,支付宝)又会做出不同的反应(例如打开浏览器,打开通讯录等),常见文本类型有如下:
URL www.baidu.com
联系方式 MECARD:N:1;ORG:1;TEL:1;URL:www.baidu.com;EMAIL:1234567@qq.com;ADR:1 1;NOTE:11;;
电子邮箱 MAILTO:freemouse@email.com
电话号码 TEL:13955555555
短信(SMS) SMSTO:13955555555:你好,二维码发短信
地理位置 GEO:40.71872,-73.98905,100
获取软件(Android) market://details?id=org.example.foo
获取Wifi配置(Android) WIFI:T:WPA;S:mynetwork;P:mypass;;
QRCode的组成
对照上图,我们挑一些重点的来做说明:
- 定位图案-Position Detection Pattern
- 定位图案-Timing Patterns
- 定位图案-Alignment Patterns
只有Version 2以上(包括Version2)的二维码需要这个东东 - 功能性数据-Format Information
存在于所有的尺寸中,用于存放一些格式化数据的 - 功能性数据-Version Information
在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。二维码版本最直观的感受就是决定了二维码的大小和数据容量。 - 正文-正文编码
常用的主要是Numeric mode 数字编码,Alphanumeric mode 字符编码,Byte mode 字节编码。Numeric mode只能用来表示数字,Alphanumeric mode可以用来表示大写英文字母,数字,$ % * + – . / : 空格。Byte mode 字节编码可以用来表示字节。其中由于Numeric mode只能表示数字,Alphanumeric mode不能表示小写英文字母,因此Byte mode灵活性最好。 - 正文-结束码
标志着正文的结束。 - 正文-补齐码
通过反复添加补齐码使正文长度达到QRCode容量最大限制。 - 纠错码 纠错码有四个级别,分别是L,M,Q,H。每个模式纠错力度不同,正因为有纠错码的存在所以破损或不全的二维码也可以识别。
| 等级 | 纠错力度 |
|---|---|
| L水平 | 7%的字码可被修正 |
| M水平 | 15%的字码可被修正 |
| M水平 | 15%的字码可被修正 |
| H水平 | 30%的字码可被修正 |
QRCode 生成过程
绘制定位图形 -》 绘制功能数据 -》 将正文编码为二进制 -》 追加结束码和补齐码形成正文 -》 生成纠错码 -》 穿插混合正文和纠错码 -》 为上一步混合的数据加掩码来使数据分布的更均衡 -》 将最终结果按照 0白1黑 绘制到二维码图纸上
如果你还有疑问或者想进一步了解QRCode,详见本文的参考
https://coolshell.cn/articles/10590.html
https://blog.csdn.net/u012611878/article/details/53167009
如何用技术方案(java后台)编解码二维码?
这里推荐使用谷歌的zxing
- 相关pom请见 mvnrepository.com/search?q=co…
- 相关源码请见 github.com/zxing/zxing
pom.xml:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.0</version>
</dependency>
QRCodeUtil.java:
// 生成二维码
public static void main(String[] args) {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode("你好 world", BarcodeFormat.QR_CODE, 500, 500, hints);
MatrixToImageWriter.writeToPath(bitMatrix, "png", Paths.get("D://test.png"));
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
在线 QRCode 生成/解析
- 二维码生成: zxing.appspot.com/generator
- 二维码解析: zxing.org/w/decode.js…
如何生成能亮瞎眼的二维码
python: github.com/sylnsfar/qr…
java: mp.weixin.qq.com/s/5Ja-J0dhJ…
文章参考:
blog.csdn.net/u012611878/…
coolshell.cn/articles/10…
github.com/zxing/zxing
www.cnphp.info/2-d-barcode…
www.cnblogs.com/guorongtao/…
www.qrcode.com/zh/about/ve…
www.swisseduc.ch/informatik/…