二維碼
1. 二維碼的分類
- 線性堆疊式二維碼
- 矩陣式二維碼
- 郵政碼
線性堆疊式二維碼:
建立在一維條形碼基礎之上,按需要堆積成兩行或者多行。
實現:PDF417、Ultracode、Code 49、Code16K
矩陣式二維碼:
在一個矩形空間通過黑、白像素在矩陣中的不同分佈進行編碼。在矩陣相應元素位置上,用點(方點、原點或者其他圖形)的出現表示二進制 1, 點的不出現表示二進制的 0 。
實現:Data Matrix、Maxi Code、Aztec Code、QR Code、Vericode
郵政碼:
通常通過不同長度的條進行編碼,主要用於郵件編碼。
實現:POSTNET、BPO 4-STATE
2. 二維碼的優缺點
優點:
高密度編碼,信息容量大(500 多漢字)、編碼範圍廣、容錯能力強、編譯可靠性高、可引入加密措施、成本低,一直做,持久耐用
缺點:
二維碼技術成爲手機病毒、釣魚網站傳播的新渠道、信息泄露
3. QR Code
目前流行的三大國際標準:
PDF417:不支持中文
DM:專利未公開,需要支付專利費用
QR Code:專利公開,支持中文
QR Code 的糾錯能力:
- L 級別:約可糾錯 7% 的數據碼字
- M 級別:約可糾錯 15% 的數據碼字
- Q 級別:約可糾錯 25% 的數據碼字
- H 級別:約克糾錯 30% 的數據碼字
生成二維碼的方法
- java 藉助第三方的 jar 包,如:zxing(谷歌)、QRCode.jar
- javascript 使用,jquery.qrcode.js
4. 實例
後端使用 zxing 生成二維碼:
導入 jar 包:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
生成二維碼代碼:
package cn.nianzuochen.qrcode;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
// 生成 二維碼
public class CreateQRCode {
public static void main(String[] args) {
int width = 300;
int height = 300;
String format = "jpg";
String content = "http://www.baidu.com";
// 定義二維碼參數
HashMap hints = new HashMap();
// 確定字符集的編碼
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 確定糾錯等級
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
// 設置邊距
hints.put(EncodeHintType.MARGIN, 2);
try {
// 確定內容,編碼格式,寬,高,其他配置參數,獲取二維碼矩陣值
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
// 將生成的圖片保存在指定路徑下
Path file = new File("F:/qrcode/image.jpg").toPath();
MatrixToImageWriter.writeToPath(bitMatrix, format, file);
} catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
解析二維碼代碼:
package cn.nianzuochen.qrcode;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
public class ReadQRCode {
public static void main(String[] args) {
// 讀取二維碼的對象
MultiFormatReader formatReader = new MultiFormatReader();
// 二維碼存儲位置
File file = new File("F:/qrcode/image.jpg");
try {
// 讀取圖片信息
BufferedImage image = ImageIO.read(file);
// 獲取二進制矩陣值
BinaryBitmap binaryBitmap =
new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
// 定義二維碼參數
HashMap hints = new HashMap();
// 確定字符集的編碼
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 解碼
Result result = formatReader.decode(binaryBitmap, hints);
// 打印解碼結果
System.out.println("解析結果:" + result.toString());
System.out.println("二維碼格式類型:" + result.getBarcodeFormat());
System.out.println("二維碼文本內容:" + result.getText());
} catch (IOException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
}
}
}
前端使用 jquery-qrcode 生成
github 地址:https://github.com/jeromeetienne/jquery-qrcode
下載之後可以在裏面找到 demo.html,所需要的是 jquery 和 jquery-qrcode 文件
<html>
<head>
<title>Demo page</title>
</head>
<body>
<div id="output"></div>
<script type="text/javascript" src="../src/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="../jquery.qrcode.min.js"></script>
<script>
jQuery(function(){
jQuery('#output').qrcode({width: 64,height: 64,text: "www.baidu.com"});
})
</script>
</body>
</html>
因爲二維碼的容錯性很好,很多帶 Logo 的二維碼,這是利用了二維碼容錯性,使用 ps 等摳圖或者 Java 繪圖的類,對生成的圖片進行二次處理的結果。
創建個人電子名片,只需要將符合 VCard 規範(https://blog.csdn.net/xfyangle/article/details/58601585)的信息寫入就可以。
String content ="BEGIN:VCARD\n" +
"VERSION:2.1\n" +
"N:姓;名\n" +
"FN:姓名\n" + // 姓名
"NICKNAME:nickName\n" + // 暱稱
"ORG:公司;部門\n" + // 組織
"TITLE:職位\n" + // 職位
"TEL;WORK;VOICE:電話1\n" +
"TEL;WORK;VOICE:電話2\n" +
"TEL;HOME;VOICE:電話1\n" +
"TEL;HOME;VOICE:電話2\n" +
"TEL;CELL;VOICE:213231231\n" + // 移動電話
"TEL;PAGER;VOICE:0775\n" + // 電話
"TEL;WORK;FAX:傳真\n" +
"TEL;HOME;FAX:傳真\n" +
"ADR;WORK:;;單位地址:深圳;廣東;43000;國家\n" +
"ADR;HOME;POSTAL;PARCEL:;;街道地址;深圳;廣東;43000;中國\n" +
"URL:網址\n" +
"EMAIL;PREF;INTERNET:郵箱地址\n" +
"X-QQ:11111111\n" +
"END:VCARD";