说明:Hutool 生成的二维码形式有File形式、buffer形式,也有Base64形式,本文没有Base64的形式,具体需要自己生成,方法是: String s = QrCodeUtil.generateAsBase64(); 方法有4种方法重载,如有需要自行调试。

老规矩 Maven

        <!--Hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.3</version>
        </dependency>

工具类

生成到本地方法,同时(紫色代码)有一个返回buff流,方便直接返还给前端

package com.zanglikun.juc.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import cn.hutool.http.HttpUtil;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;

/**
 * @author : zanglikun
 * @date : 2021/11/2 16:22
 * @Version: 1.0
 * @Desc : 自己封装Hutool的二维码生成工具
 * 本工具类 没有很好的检测 乱传入数据的问腿,后面再更新 (我没有完整检查TryCatch,但依旧有基本的Try Catch!)
 */
public class QRGenerate {

    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo
     *
     * @param info  二维码内容
     * @param logoPath  本地logo的路径
     * @param targetPath    生成文件路径
     * @return
     */
    public static String localLogoQRToLocal(String info, String logoPath, String targetPath) {
        // 读取Logo文件 创建生成到本地的空文件
        File logo_image = FileUtil.file(logoPath);
        File target_image = FileUtil.file(targetPath);
        // 定义二维码配置
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(2);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(Color.BLACK.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(Color.WHITE.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (logoPath != "" && logoPath != null && logo_image != null) {
            try {
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }

    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo 同时指定前景色 与 背景色
     *
     * @param info  二维码内容
     * @param logoPath  本地logo的路径
     * @param targetPath    生成文件路径
     * @param fore  前景色
     * @param back  背景色
     * @return
     */
    public static String localLogoQRToLocal(String info, String logoPath, String targetPath, Color fore, Color back) {
        // 读取Logo文件 创建生成到本地的空文件
        File logo_image = FileUtil.file(logoPath);
        File target_image = FileUtil.file(targetPath);
        // 定义二维码配置
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(2);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(fore.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(back.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (logoPath != "" && logoPath != null && logo_image.length() > 0) {
            try {
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }

    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo 同时指定前景色 与 背景色
     *
     * @param info  二维码内容
     * @param logoPath  本地logo的路径
     * @param targetPath    生成文件路径
     * @param width 宽度
     * @param height    高度
     * @param fore  前景色
     * @param back  背景色
     * @return
     */
    public static String localLogoQRToLocal(String info, String logoPath, String targetPath, int width, int height, Color fore, Color back) {
        // 读取Logo文件 创建生成到本地的空文件
        File logo_image = FileUtil.file(logoPath);
        File target_image = FileUtil.file(targetPath);
        // 定义二维码配置
        QrConfig config = new QrConfig(width, height);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(1);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(fore.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(back.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (logoPath != "" && logoPath != null && logo_image.length() > 0) {
            try {
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }


    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo
     *
     * @param info  二维码内容
     * @param urlpath   网络logo路径
     * @param targetPath    生成文件路径
     * @return
     */
    public static String urlLogoQRToLocal(String info, String urlpath, String targetPath) {
        // 读取Logo文件 创建生成到本地的空文件
        File url_image = new File("url_image");
        File target_image = FileUtil.file(targetPath);

        // 定义二维码配置
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(2);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(Color.BLACK.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(Color.WHITE.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (urlpath != "" && urlpath != null) {
            try {
                File logo_image = HttpUtil.downloadFileFromUrl(urlpath, url_image);
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }

    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo 同时指定前景色 与 背景色
     *
     * @param info  二维码内容
     * @param urlpath   网络logo路径
     * @param targetPath    生成文件路径
     * @param fore  前景色
     * @param back  背景色
     * @return
     */
    public static String urlLogoQRToLocal(String info, String urlpath, String targetPath, Color fore, Color back) {
        // 读取Logo文件 创建生成到本地的空文件
        File url_image = new File("url_image");
        File target_image = FileUtil.file(targetPath);
        // 定义二维码配置
        QrConfig config = new QrConfig(300, 300);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(2);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(fore.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(back.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (urlpath != "" && urlpath != null) {
            try {
                File logo_image = HttpUtil.downloadFileFromUrl(urlpath, url_image);
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }

    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo 同时指定前景色 与 背景色
     *
     * @param info  二维码内容
     * @param urlpath   网络logo路径
     * @param targetPath    生成文件路径
     * @param width 宽度
     * @param height    高度
     * @param fore  前景色
     * @param back  背景色
     * @return
     */
    public static String urlLogoQRToLocal(String info, String urlpath, String targetPath, int width, int height, Color fore, Color back) {
        // 读取Logo文件 创建生成到本地的空文件
        File url_image = new File("url_image");
        File target_image = FileUtil.file(targetPath);
        // 定义二维码配置
        QrConfig config = new QrConfig(width, height);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(1);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(fore.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(back.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (urlpath != "" && urlpath != null) {
            try {
                File logo_image = HttpUtil.downloadFileFromUrl(urlpath, url_image);
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return "2";// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        target_image = QrCodeUtil.generate(info, config, target_image);
        return "1";// 成功
    }


    /**
     * 生成二维码到本地路径
     * 如果logo path是Null或者"" 即认为不使用logo 同时指定前景色 与 背景色
     *
     * @param info  二维码内容
     * @param urlpath   网络logo路径
     * @param width 宽度
     * @param height    高度
     * @param fore  前景色
     * @param back  背景色
     * @return 返还的BufferedImage 用HttpServletResponse对象获取输出流对象OutputStream
     * 用ImageIO.write(BufferedImage,图片后缀,OutputStream)  输出流对象OutputStream.flush 然后close
     */
    public static BufferedImage urlLogoQRToBuffer(String info, String urlpath, int width, int height, Color fore, Color back) {
        // 读取Logo文件 创建生成到本地的空文件
        File url_image = new File("url_image");
        // 定义二维码配置
        QrConfig config = new QrConfig(width, height);
        // 设置边距,既二维码和背景之间的边距
        config.setMargin(1);
        // 设置前景色,既二维码颜色(青色)
        config.setForeColor(fore.getRGB());
        // 设置背景色(灰色)
        config.setBackColor(back.getRGB());
        // 设置自己的Logo 如果Logo文件为空 会报错
        if (urlpath != "" && urlpath != null) {
            try {
                File logo_image = HttpUtil.downloadFileFromUrl(urlpath, url_image);
                config.setImg(logo_image);
            } catch (Exception e) {
                e.printStackTrace();
                return null;// "请传入正确图片路径!";
            }
        }
        //将生成的二维码文件,写入到本地指定文件 file中
        BufferedImage bufferedImage = QrCodeUtil.generate(info, config);
        return bufferedImage;// 成功
    }

    public static void main(String[] args) {
        System.out.println("LogoPath 没有图片,则生成的图片将没有Logo,测试前请准备D盘根目录下,localLogo.jpg 同时最好准备一个网络路径的图片 替换 urlLogoQR方法。 X盘不存在图片");
        localLogoQRToLocal("www.baidu.com", "", "D://Q1.jpg");
        localLogoQRToLocal("www.baidu.com", "X://localLogo.jpg", "D://Q2.jpg", Color.BLACK, Color.WHITE);
        localLogoQRToLocal("www.baidu.com", "D://localLogo.jpg", "D://Q3.jpg", 200, 200, Color.BLACK, Color.WHITE);
        urlLogoQRToLocal("www.baidu.com", "", "D://Q4.jpg");
        urlLogoQRToLocal("www.baidu.com", "https://ahxunliaoavatar.oss-cn-shanghai.aliyuncs.com/avatar/2021/11/03/16359083016748056.jpg", "D://Q5.jpg", Color.YELLOW, Color.WHITE);
        urlLogoQRToLocal("www.baidu.com", "https://ahxunliaoavatar.oss-cn-shanghai.aliyuncs.com/avatar/2021/11/03/16359083016748056.jpg", "D://Q6.jpg", 100, 100, Color.YELLOW, Color.BLACK);

    }
}

工具类自带测试生成的内容有:

单独返还给前端二维码图片

需要的参数有:二维码基础信息、logoURL(不填写传入“”)、宽、高、前景色(枚举)、背景色(枚举)

    @GetMapping("/qrcode")
    public void giveH5Qrcode(HttpServletResponse response){
        BufferedImage bufferedImage = QRGenerate.urlLogoQRToBuffer("https://www.zanglikun.com", "https://zhenliaoweb.oss-cn-hangzhou.aliyuncs.com/test/blackcat.gif",300,300, Color.YELLOW,Color.BLACK);
        try {
            OutputStream out = response.getOutputStream();
            ImageIO.write(bufferedImage,"PNG",out);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

直接访问接口路径 直接返回图片:如图👇