引入:java
如今有了微信,因此有了形形×××的二維碼,特別是我每天趕地鐵上班,在地鐵站內充斥着各個二維碼,還有火車票右下角都有二維碼。其實咱們這裏常常用到的二維碼是 QR二維碼,它是由日本人發明的,是二維碼的一種。微信
從大致上看,通常一個QR二維碼結構以下,其中有3個定位標誌,右下角是校驗標誌,還有一些定時標誌,版本信息,格式信息,這些肉眼不能識別,可是特殊設備卻能讀取。ide
關於QR二維碼的信息,能夠參見如下文章:工具
http://zh.wikipedia.org/wiki/QR%E7%A2%BC網站
實踐:
google
咱們這裏就用JAVA代碼來實現生成QR二維碼圖片以及如何從二維碼圖片中還原出原始文本內容,咱們依然使用ZXing庫:編碼
package com.charles.study.barcode.twodimensions; import java.awt.p_w_picpath.BufferedImage; import java.io.File; import java.util.HashMap; import java.util.Hashtable; import java.util.Map; import javax.p_w_picpathio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.EncodeHintType; import com.google.zxing.LuminanceSource; import com.google.zxing.MultiFormatReader; import com.google.zxing.MultiFormatWriter; import com.google.zxing.Result; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * 這個工具類用於處理編碼/解碼 二維碼 * @author charles.wang * */ public class TwoDimensionCodeUtil { private TwoDimensionCodeUtil(){} /** * 基於一個字符串生成相對應的QR二維碼,有指定的寬度和高度,而且存放到指定位置的文件中 * @param contents * @param width * @param height * @param fileName * @throws Exception */ public static void generate2DBarCodeImage(String contents ,int width,int height,String fileName) throws Exception{ //這裏略去入參檢查,由於不是重點 //配置Q-R 二維碼的信息 Hashtable hints= new Hashtable(); // 定義糾錯等級 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 指定二維碼的編碼規則 hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //建立二維碼對應的位圖矩陣信息 BitMatrix bitMetrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height,hints); //從入參獲取文件格式 String fileFormat = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()); //從入參建立文件對象 File outputFile = new File(fileName); //吧位圖矩陣寫入指定的圖片文件中 MatrixToImageWriter.writeToFile(bitMetrix,fileFormat,outputFile); } /** * 讀取一個QR二維碼圖片文件,還原其原始信息 * @param p_w_picpathPath * @return */ public static String resolve2DBarCodeImage(String p_w_picpathPath){ BufferedImage p_w_picpath = null; try { //讀取二維碼圖片文件 p_w_picpath = ImageIO.read(new File(p_w_picpathPath)); if (p_w_picpath == null) { System.out.println("二維碼圖片不存在."); } LuminanceSource source = new BufferedImageLuminanceSource(p_w_picpath); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); //設置二維碼的解碼規則 Map<DecodeHintType,String> hints = new HashMap<DecodeHintType, String>(); hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); //基於二維碼圖片文件解碼得到其結果 Result result = new MultiFormatReader().decode(bitmap,hints); //從結果中得到原始文本 return result.getText(); } catch (Exception e) { e.printStackTrace(); } return null; } public static void main(String [] args){ //二維碼Demo //生成二維碼 try{ String qr_contents= "Charles的二維碼範例"; int qr_width = 200; int qr_height= 200; generate2DBarCodeImage(qr_contents,qr_width,qr_height,"D:/Framework Study/BarCode/TwoDimensions/newQRcode.png"); }catch(Exception ex){ System.err.print("生成二維碼出錯"); } //解析二維碼 String qr_original = resolve2DBarCodeImage("D:/Framework Study/BarCode/TwoDimensions/newQRcode.png"); System.out.println("還原的信息爲:"+qr_original); } }
咱們作實驗,當運行生成二維碼部分時候,它會在D:/Framework Study/BarCode/TwoDimensions/newQRCode.png生成一個二維碼圖片文件,大小格式都符合:spa
咱們查看這個二維碼圖片文件,顯然,它說的特徵符合咱們開始介紹的QR二維碼的特徵:3d
而後咱們運行下面的解析過程,則控制檯顯示:code
說明咱們的代碼是徹底正確的.
我還用了我同事的手機掃描了我這裏生成的二維碼信息,它會顯示 」Charles的二維碼範例「文本在手機上。
福利:
這裏提供一個在線網站能夠專門去定製二維碼: