说明:Hutool 生成的二维码形式有File形式、buffer形式,也有Base64形式,本文没有Base64的形式,具体需要自己生成,方法是: String s = QrCodeUtil.generateAsBase64(); 方法有4种方法重载,如有需要自行调试。
Hutool 二维码代码
老规矩 配上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>
二次封装的Hutool工具类
生成到本地方法,同时(紫色代码)有一个返回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();
}
}
直接访问接口路径 直接返回图片:如图?
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤