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 }
運行結果: