前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hutool 二维码生成工具

Hutool 二维码生成工具

作者头像
收心
发布2022-01-19 11:36:12
2.7K0
发布2022-01-19 11:36:12
举报
文章被收录于专栏:Java实战博客

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

老规矩 Maven

代码语言:javascript
复制
        <!--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流,方便直接返还给前端

代码语言:javascript
复制
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(不填写传入“”)、宽、高、前景色(枚举)、背景色(枚举)

代码语言:javascript
复制
    @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();
        }
    }

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

特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 老规矩 Maven
  • 工具类
    • 生成到本地方法,同时(紫色代码)有一个返回buff流,方便直接返还给前端
    • 单独返还给前端二维码图片
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档