提示:本文章使用huttol工具包和GoogleZxin两种方式实现生成二维码,可根据不同需求选择方式
随着现在扫码场景越来越多,使用频率也越来越高,本文主要介绍两种不同的方式来生成二维码,通过hutool工具包来实现以图片流的方式返回二维码,可自主选择添加log或者不添加,也可以自定义传入二维码的大小灵活控制,这样的方式更适合多场景用,多场景可调用接口获取二维码;第二种方式则是通过谷歌包来实现以base64字符串生成二维码,这种方式适合像微信小程序里面调用不能接收图片流的使用场景直接接收进行解码或前端带解码可直接显示
警告! 各位大佬可根据自己业务类型选择享用!完整源码张贴即用
cn.hutool
hutool-all
5.5.9
com.google.zxing
core
3.3.3
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
/**
* 生成二维码图片流的形式返回
* @param content 二维码内容正文
* @param logourl log的存放路径
* @param width 二维码的宽
* @param height 二维码高
* @param response 响应对象
*/
public static void createQrCodeN(String content, String logourl, int width, int height, HttpServletResponse response) {
QrConfig config = new QrConfig(width, height);
//可以传入log
// File file = null;
// try {
//读取文件的方法如有需要自行编写
// file = ResourceUtils.getFile(logourl);
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// }
// //附带logo
// config.setImg(file);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// 高纠错级别
config.setErrorCorrection(ErrorCorrectionLevel.H);
// 设置前景色,既二维码颜色(自行选择颜色修改)
config.setForeColor(new Color(11, 11, 11).getRGB());
// 设置背景色(灰色)需要背景色时候打开链接
config.setBackColor(new Color(242,242,242).getRGB());
/* try {
OutputStream out = new FileOutputStream("");
} catch (FileNotFoundException e) {
e.printStackTrace();
}*/
BufferedImage bufferedImage = QrCodeUtil.generate(//
content, //二维码内容
config
);
try {
//以JPEG格式向客户端发送也可以更改为PNG
ServletOutputStream os = response.getOutputStream();
ImageIO.write(bufferedImage, "JPEG", os);
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
重要提示:由于我自己项目并没有需要所以,如上方法缺少一个通过URL读取文件的方法,所以有需要添加log的同学可以自行补充一个读取文件的方法即可使用
com.google.zxing
core
3.3.3
/**
* 生成加密后的二维码字符串 Base64字符串二维码
* @param content 二维码正文
* @param width 二维码宽
* @param height 二维码高
* @return base64 编码后的字符串
* @throws IOException
*/
public static String crateQRCode(String content, int width, int height) throws IOException {
String resultImage = "";
if (!StringUtils.isEmpty(content)) {
ServletOutputStream stream = null;
ByteArrayOutputStream os = new ByteArrayOutputStream();
@SuppressWarnings("rawtypes")
HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8”
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级
hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距
try {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(bufferedImage, "png", os);
/**
* 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析,可以让前端加,也可以在下面加上
*/
resultImage = new String("data:image/jpeg;base64," + Base64.encode(os.toByteArray()));
return resultImage;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stream != null) {
stream.flush();
stream.close();
}
}
}
return null;
}
两种方式均可张贴即用,需自行编写调用
方案一:灵活度较高,可适用于多种场景,但是对于安全限制的不能使用;
方案二:进行编码返回直接了当但是部分不解码的场景不太适用,并且没有实现添加log,所以欢迎大佬进行补充
自行选择方案张贴享用!欢迎补充