SpringBoot之二维码生成

标签: 无 分类: 未分类 创建时间:2022-11-15 02:45:47 更新时间:2025-01-17 10:39:22

1.引入依赖

引入zxing的依赖

1
2
3
4
5
6
7
8
9
10
11
<!--二维码-->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.1</version>
</dependency>

2.字节流输出图片

在后台生成二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@RequestMapping(value = "img")
public void qrcodeimg(@RequestBody(required = false) String jsonStr){
try {
response.setCharacterEncoding("UTF-8");
response.reset();

//这一步很重要,如果不设置预览正常,但是前天FileReader.src操作后就有问题。
response.setContentType("image/".concat("jpeg").concat(";charset=UTF-8"));
response.setHeader("Content-Disposition", "inline; filename=\"qrcode.jpeg\"");

// 如果内容为空
if(jsonStr==null||jsonStr.isEmpty()){
jsonStr="http://www.proheng.net";
}

byte[] fileBytes =qRcodeZxingUtils.generateQRcodeByte(jsonStr,256,"jpeg") ;
ServletOutputStream os = response.getOutputStream();
os.write(fileBytes);
os.flush();
os.close();
}catch (Exception e){
logger.error("qrcodeimg",e);
}
}

其中生成二维码的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 生成二维码 生成二维码图片字节流
*
* @param content 二维码内容
* @param width 二维码宽度和高度
* @param picFormat 二维码图片格式
*/
public byte[] generateQRcodeByte(String content, int width, String picFormat) {
byte[] codeBytes = null;
try {
// 构造二维字节矩阵,将二位字节矩阵渲染为二维缓存图片
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, width);
BufferedImage image = toBufferedImage(bitMatrix);

// 定义输出流,将二维缓存图片写到指定输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, picFormat, out);

// 将输出流转换为字节数组
codeBytes = out.toByteArray();

} catch (WriterException | IOException e) {
e.printStackTrace();
}
return codeBytes;
}
参考文章:
1.图片流输出到前台成图片预览显示
2.java生成QR二维码 这个主要参考文章:1.二维码的原理主要是依靠斜左上方的三个矩形框来进行定位,然后解析图片的黑白像素对应计算机编码的01操作。那么如果是二维码里面藏的东西过多的时候,二维码可能会很丑陋,几个定位符非常的小,里面的黑白点非常的密集。这个时候不妨尝试一下利用缓存,二维码里面只藏有简单的随机字符串,然后再根据扫描得到的字符串去请求缓存拿到真正的有用信息。(这种就是代理的思想);2.在第1点的基础上,有时候二维码就是为了做登陆的,要求极高的安全性。在二维码里面藏了一下检验,防串改的字串,比如jwtToken。那么这个二维码很有可能会非常丑,遇到了不懂技术的产品,可能要你改需求。低效的沟通还不如直接拿巨头的成本给他看,直接拿微信公众平台(https://mp.weixin.qq.com/)的登陆页面二维码给他看,让对方明白为了安全有的时候不得不牺牲美观。
3.Java后端生成二维码,Base64后,前端直接使用
4.聊聊 Web 项目二维码生成的最佳姿势 将二维码生成放在了前端,这种流程的实现方式,完全摒弃了后端生成二维码的部分代码、将生成二维码图片放入项目路径的两个过程。前端随用随生成,需要注意的是返回给前端的跳转链接中的参数需要加密处理,毕竟前端是个是非之地。

3.生成base64字符串

可以使用zxing库将内容生成一个base64的字符串,前端引用的时候,只需要使用img标签的src指向这个字符串就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 生成二维码
ByteArrayOutputStream os=new ByteArrayOutputStream();
HashMap<EncodeHintType,Comparable> hints=new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET,"UTF-8"); // 指定字符集
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定二维码的纠错等级
hints.put(EncodeHintType.MARGIN,2); // 设置图片的边距
QRCodeWriter qrCodeWriter=new QRCodeWriter();
BitMatrix bitMatrix=qrCodeWriter.encode(qrCodeUrl, BarcodeFormat.QR_CODE,200,200,hints);

BufferedImage bufferedImage= MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(bufferedImage,"png",os);
// 转换成base64字符串
String resultImage=new String("data:image/png;base64,"+ Base64.encode(os.toByteArray()));

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。