废话不多说系列,直接上代码(๑•̀ㅂ•́)و✧
一、Maven依赖
<!-- 二维码支持包 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.2.0</version>
</dependency>
二、源码
核心功能:
- 生成二维码图片;
- 随机生成指定长度的验证码字符串;
- 解析指定路径下的二维码图片中的验证码字符串;
- 根据内容,生成指定宽高、指定格式的二维码图片;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Random;
/**
* 利用Google的ZXing工具包,生成和解析二维码图片
* Created by zhengjingli on 2017/9/27.
*/
public class QRCodeEvents {
public static void main(String[] args) {
String text = generateNumCode(12); //随机生成的12位验证码
System.out.println("随机生成的12位验证码为: " + text);
int width = 100; //二维码图片的宽
int height = 100; //二维码图片的高
String format = "png"; //二维码图片的格式
//获取代码部署的路径
//String path=request.getSession().getServletContext().getRealPath("")+"\\assets\\global\\img\\qrCodeTemp\\";
try {
//生成二维码图片,并返回图片路径
//生成二维码图片,并返回图片路径
String path = "D:/";
String fileName = getUuid() + ".png";
String pathName = generateQRCode(text, width, height, format, path, fileName);
System.out.println("生成二维码的图片路径: " + pathName);
String content = parseQRCode(pathName);
System.out.println("解析出二维码的图片的内容为: " + content);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 随机生成指定长度的验证码
*
* @param length 验证码长度
* @return 生成的验证码
*/
private static String generateNumCode(int length) {
String val = "", charStr = "char", numStr = "num";
Random random = new Random();
//参数length,表示生成几位随机数
for (int i = 0; i < length; i++) {
String charOrNum = random.nextInt(2) % 2 == 0 ? charStr : numStr;
//输出字母还是数字
if (charStr.equalsIgnoreCase(charOrNum)) {
//输出是大写字母还是小写字母
int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
val += (char) (random.nextInt(26) + temp);
} else if (numStr.equalsIgnoreCase(charOrNum)) {
val += String.valueOf(random.nextInt(10));
}
}
return val;
}
/**
* 解析指定路径下的二维码图片
*
* @param filePath 二维码图片路径
* @return
*/
private static String parseQRCode(String filePath) {
String content = "";
try {
File file = new File(filePath);
BufferedImage image = ImageIO.read(file);
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);
Map<DecodeHintType, Object> hints = new HashMap<>();
hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
MultiFormatReader formatReader = new MultiFormatReader();
Result result = formatReader.decode(binaryBitmap, hints);
System.out.println("result 为:" + result.toString());
System.out.println("resultFormat 为:" + result.getBarcodeFormat());
System.out.println("resultText 为:" + result.getText());
//设置返回值
content = result.getText();
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
* 根据内容,生成指定宽高、指定格式的二维码图片
*
* @param text 内容
* @param width 宽
* @param height 高
* @param format 图片格式
* @return 生成的二维码图片路径
* @throws Exception
*/
private static String generateQRCode(String text, int width, int height, String format, String pathName, String fileName) throws Exception {
Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
//String pathName = "D:/new.png";
if (pathName == null || pathName.equals("")) {
pathName = "D:/";
}
if (fileName == null || fileName.equals("")) {
fileName = getUuid() + ".png";
}
String filePath = pathName + fileName;
File outputFile = new File(filePath);
MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);
return filePath;
}
/**
* 获取随机唯一性的UUID
* @param flag true表示去除中间的-,false表示不去除中间的-
* @return
*/
public static String getUuid(boolean flag){
String uuid = UUID.randomUUID().toString();
if(flag){
uuid = uuid.replaceAll("-", "");
}
return uuid;
}
}
三、示例
控制台返回的结果:
随机生成的12位验证码为: 2T3PB87c07H9
生成二维码的图片路径: D:/56a408a930b24d59b5d536b9e4c7a8cf.png
result 为:2T3PB87c07H9
resultFormat 为:QR_CODE
resultText 为:2T3PB87c07H9
解析出二维码的图片的内容为: 2T3PB87c07H9
至此,谢谢阅读🙏~