「Java 开发工具」[推荐]QCodeUtil2 二维码工具类(zxing.jar)

155 阅读3分钟

废话不多说系列,直接上代码(๑•̀ㅂ•́)و✧

一、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>
二、源码

核心功能:

  1. 生成二维码图片;
  2. 随机生成指定长度的验证码字符串;
  3. 解析指定路径下的二维码图片中的验证码字符串;
  4. 根据内容,生成指定宽高、指定格式的二维码图片;
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

image.png

image.png


至此,谢谢阅读🙏~

美女2.png