二維碼

二維碼

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";
發佈了155 篇原創文章 · 獲贊 87 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章