JAVA生成及解析二維碼


1  二維碼概念

1.1  二維碼定義

二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的圖形。

1.2  一維碼與二維碼

一維條碼(條形碼)是有一組粗細不同、黑白(或彩色)相間的條、空及其相應的字符(數字字母)組成的標記,即傳統條碼。

二維條碼使用某種特定的幾何圖形按一定規律在平面(二維方向)上分布的條、空相間的圖形來記錄數據符號信息。

1.3  二維碼分類

二維碼就碼制的編碼原理而言,通常分為三種類型:

  • 線性堆疊式二維碼
  • 矩陣式二維碼
  • 郵政碼

1.3.1  線性堆疊式二維碼

編碼原理:

  • 建立在一維條碼基礎之上,按需要堆積成兩行或多行。

1.3.2  矩陣式二維碼

編碼原理:

  • 在一個矩形空間通過黑、白像素在矩陣中的不同分布進行編碼。
  • 在矩陣相應元素位置上,用點(方點、圓點或其它形狀)的出現表示二進制“1”,點的不出現表示二進制的“0”。

1.3.3  郵政碼

編碼原理:

  • 郵政碼通過不同長度的條進行編碼,主要用於郵件編碼,如POSTNET、BPO 4-STATE。

1.4  二維碼優缺點

1.4.1  優點

  • 高密度編碼,信息容量大。
  • 編碼范圍廣。
  • 容錯能力強。
  • 譯碼可靠性高。
  • 可引入加密措施。
  • 成本低,已制作,持久耐用。

1.4.2  缺點

  • 二維碼技術成為手機病毒、釣魚網站傳播的新渠道。
  • 信息泄露。

2  DR Code

2.1  編碼標准

目前流行的三大國際標准:

  • PDF417:不支持中文。
  • DM:專利未公開,需支付專利費用。
  • DQ Code(Quick Response Code):專利公開,支持中文(與其他二維碼相比,具有識讀速度快、數據密度大、占用空間小的優勢)。

2.2  DQ Code糾錯能力

  • L級:越可糾錯7%的數據碼字。
  • M級:越可糾錯15%的數據碼字。
  • Q級:越可糾錯25%的數據碼字。
  • H級:越可糾錯30%的數據碼字。

2.3  JSP生成二維碼的方法

  • 借助第三方jar,如zxing和qrcodejar。
  • Javascript,如jquery.qrcode.js。
  • 關於二維碼的更多理論知識,請點這里

3  實例操作

3.1  使用zxing生成二維碼

准備:在項目中添加zxing3.2.1.jar外部庫。

程序代碼:

 1 import java.io.File;
 2 import java.nio.file.Path;
 3 import java.util.HashMap;
 4 import com.google.zxing.BarcodeFormat;
 5 import com.google.zxing.EncodeHintType;
 6 import com.google.zxing.MultiFormatWriter;
 7 import com.google.zxing.client.j2se.MatrixToImageWriter;
 8 import com.google.zxing.common.BitMatrix;
 9 import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
10 
11 //利用zxing生成二維碼
12 public class Zxing {
13     public static void main(String[] args) {
14         int width = 600;//二維碼寬度
15         int height = 600;//二維碼高度
16         String format = "png";//生成的圖片格式
17         String content = "祁俊輝";//生成的內容//這里可以使用“http://www.baidu.com”實現跳轉
18         
19         //定義二維碼的參數
20         HashMap hints = new HashMap();
21         hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//編碼方式
22         hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//糾錯等級
23         hints.put(EncodeHintType.MARGIN, 2);//邊距
24         
25         //生成二維碼
26         try {
27             BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
28             Path file = new File("E:/二維碼.png").toPath();//路徑選擇
29             MatrixToImageWriter.writeToPath(bitMatrix, format, file);//生成到一個路徑下
30             System.out.println("生成成功!");
31         } catch (Exception e) {
32             e.printStackTrace();
33             System.out.println("生成失敗!");
34         }
35     }
36 }

生成結果:

3.2  使用zxing解析二維碼

程序代碼:

 1 import java.awt.image.BufferedImage;
 2 import java.io.File;
 3 import java.io.IOException;
 4 import java.util.HashMap;
 5 import javax.imageio.ImageIO;
 6 import com.google.zxing.BinaryBitmap;
 7 import com.google.zxing.EncodeHintType;
 8 import com.google.zxing.MultiFormatReader;
 9 import com.google.zxing.NotFoundException;
10 import com.google.zxing.Result;
11 import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
12 import com.google.zxing.common.HybridBinarizer;
13 
14 
15 public class Zxing_JX {
16     public static void main(String[] args) {
17         try {
18             MultiFormatReader formatReader = new MultiFormatReader();
19             File file = new File("E:/二維碼.png");
20             
21             BufferedImage image = ImageIO.read(file);
22             
23             BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
24             
25             //定義二維碼的參數
26             HashMap hints = new HashMap();
27             hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//編碼方式
28             
29             Result result = formatReader.decode(binaryBitmap, hints);
30             
31             System.out.println("解析結果:"+result.toString());
32             System.out.println("二維碼格式類型:"+result.getBarcodeFormat());
33             System.out.println("二維碼文本內容:"+result.getText());
34             
35         } catch (NotFoundException e) {
36             e.printStackTrace();
37         } catch (IOException e) {
38             e.printStackTrace();
39         }
40     }
41 }

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM