1. 前言
隨着移動互聯網的發展,我們經常在火車票、汽車票、快餐店、電影院、團購網站以及移動支付等各個場景下見到二維碼的應用,可見二維碼以經滲透到人們生活的各個方面。條碼、二維碼以及RFID被人們應用的更普遍一些,二維碼相對一維碼,具有數據存儲量大,保密性好等特點,能夠更好地與智能手機等移動終端相結合,形成了更好地互動性和用戶體驗。而與RFID相比較,二維碼不僅成本優勢凸顯,他的用戶體驗和互動性也具有更好地應用前景。
作為物聯網浪潮產業下的一個環節,二維碼的技術應用解決方案層出不窮,二維碼已成移動互聯網的入口。
2. 基礎知識
2.1 二維碼
二維碼又稱QR Code,QR全稱Quick Response,是一個近幾年來移動設備上超流行的一種編碼方式,它比傳統的Bar Code條形碼能存更多的信息,也能表示更多的數據類型。
二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的;在代碼編制上巧妙地利用構成計算機內部邏輯基礎的“0”、“1”比特流的概念,使用若干個與二進制相對應的幾何形體來表示文字數值信息,通過圖象輸入設備或光電掃描設備自動識讀以實現信息自動處理:它具有條碼技術的一些共性:每種碼制有其特定的字符集;每個字符占有一定的寬度;具有一定的校驗功能等。同時還具有對不同行的信息自動識別功能、及處理圖形旋轉變化點。
2.2 QRCode
QR Code碼,是由Denso公司於1994年9月研制的一種矩陣二維碼符號,它具有一維條碼及其它二維條碼所具有的信息容量大、可靠性高、可表示漢字及圖象多種文字信息、保密防偽性強等優點。
3. 利用Java生成解析二維碼技術實現
3.1 在github上下載zxing,最新版本為3.3.1
下載后的文件目錄,我們主要需要core
和javase
目錄下的核心代碼
3.2 生成jar包
將core
和javase
文件下的com
包在eclipse里導出jar包
3.3 創建項目
項目目錄
3.4 生成二維碼
CreateQRCode核心代碼
/**
* @author echo
*/
package com.echo.zxing;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class CreateQRCode {
public static void main(String[] args) {
int width = 300;
int height = 300;
String format = "png";
String content = "https://echoingursb.github.io/";
// 定義二維碼的參數
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("E:/ada/code/img.png").toPath();
MatrixToImageWriter.writeToPath(bitMatrix, format, file);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
生成圖片結果
3.5 解析二維碼
ReadQRCode核心代碼
/**
* @author echo
*/
package com.echo.zxing;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.imageio.ImageIO;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
public class ReadQRCode {
public static void main(String[] args) {
MultiFormatReader multiFormatReader = new MultiFormatReader();
File file = new File("E:/ada/code/img.png");
BufferedImage image = null;
try {
image = ImageIO.read(file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
// 定義二維碼的參數
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
try {
Result result = multiFormatReader.decode(binaryBitmap, hints);
System.out.println("解析結果:" + result.toString());
System.out.println("二維碼類型:" + result.getBarcodeFormat());
System.out.println("二維碼文本內容:" + result.getText());
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
解析圖片結果
傳送門