一、二维码简介
- 用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息
- 比一维条形码能存更多信息,表示更多数据类型
- 能够存储数字/字母/汉字/图片等信息
- 字符集128个字符
- 可存储几百到几十KB字符
- 抗损坏
二、Zxing(Zebra Crossing)
- Zxing(Zebra Crossing)
– Google 出品
– 支持1D和2D的Barcode - 主要类
BitMatrix 位图矩阵
MultiFormatWriter 位图编写器
MatrixToImageWriter 写入图片
三、通过maven导入依赖包
<!-- 生成二维码和生成二维码的依赖包 -->
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
四、代码实现
- 编写生成和解析二维码的工具类QrCode
package com.fz.util;
import com.google.zxing.*;
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;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: qrcode
* @description: 生成二维码
* @author: Fang
* @create: 2020-05-01 09:19
**/
public class QrCode {
/**
* 生成二维码
* @param width 二维码宽度
* @param height 二维码高度
* @param fileDirectory 二维码存储路径
* @param content 二维码内容
* @param imageFormat 生成的图片格式
*/
public static void createQrCode(int width,int height,String fileDirectory, String content,String imageFormat){
File file=new File(fileDirectory);
if (!file.exists()){
file.mkdirs();
}
//给二维码取名字,以生成的时间命名
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
String fileName=sdf.format(date)+"."+imageFormat;
//第一步,定义二维码的参数
Map<EncodeHintType,Object> hints=new HashMap<>(5);
//1、设置编码格式
hints.put(EncodeHintType.CHARACTER_SET,"utf-8");
//2、设置容错等级
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.Q);
//3、设置边距
hints.put(EncodeHintType.MARGIN,1);
try {
BitMatrix bitMatrix=new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE,width,height,hints);
MatrixToImageWriter.writeToPath(bitMatrix,imageFormat,new File(fileDirectory+File.separatorChar+ fileName).toPath());
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 解析二维码
* @param file 二维码
* @return Result
*/
public static Result encodeQrCode(File file) {
try {
//创建MultiFormatReader
MultiFormatReader reader = new MultiFormatReader();
//读取二维码
BufferedImage image = ImageIO.read(file);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
Map<DecodeHintType, Object> hint=new HashMap<>(2);
hint.put(DecodeHintType.CHARACTER_SET,"utf-8");
//解析二维码
return reader.decode(binaryBitmap,hint);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 编写测试类TestQrCode
import com.fz.util.QrCode;
import com.google.zxing.Result;
import org.junit.Test;
import java.io.File;
import java.util.Date;
/**
* @program: ssmshiro
* @description:
* @author: Fang
* @create: 2020-05-01 10:50
**/
public class TestQrCode {
public static void main(String[] args) {
//生成二维码
QrCode.createQrCode(300,300,"E:/IdeaProjects/ssmshiro/qrcode/","今天","png");
//解析二维码 E:\IdeaProjects\ssmshiro\qrcode\20200501123646.png
File file=new File("E:/IdeaProjects/ssmshiro/qrcode/20200501123646.png");
Result result = QrCode.encodeQrCode(file);
if (result!=null){
//二维码类型
System.out.println(result.getBarcodeFormat());
//二维码的元数据例如容错等级
System.out.println(result.getResultMetadata());
//二维码内容
System.out.println("内容:"+result.getText());
//二维码生成时间
System.out.println(new Date(result.getTimestamp()));
}else{
System.out.println("解析失败");
}
}
}