思路
现阶段遇到这样一个问题,在原有的产品上加入线下优惠券模式,用户领取优惠券以后,获取到一个唯一的ID作为领取凭证,但是在线下用扫码枪进行扫码的时候,总不能让人手动输入吧
于是乎就想出了一个办法,后端提供一个接口,前端请求发起后,将需要加入的字符生成出二维码,然后用Base64进行编码后返回,前台直接展示即可
本地写入二维码就采用字节流的方式,将二维码直接写入到磁盘即可。
Maven依赖
<dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.0</version> </dependency>
这里依赖的jar包主要是Google 的zxing 进行二维码的生成
代码
QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode("622921", BarcodeFormat.QR_CODE, 600, 600); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream); Base64.Encoder encoder = Base64.getEncoder(); String text = encoder.encodeToString(outputStream.toByteArray()); System.out.println(text);
说明:需要在二维码里面展现的内容就是字符串622921
参数600*600 表示的就是生成后二维码的宽高,单位px 像素
这里我们使用的是Java自带Base64工具类进行生成的base64编码
生成后的base64如下所示
iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYAQAAAACWHaVxAAABkUlEQVR42u3czYrDIBQGUKEP5qv7YAWHtszUX8i0WWg4LgI2erZy+90Y8nkjsFgsFovFYrFYLBaLxWKxWCwWi8VisVgnWCk04/b49R5CfDye0/ESFovFYm1mlW9e0+fm+AInS1gsFou1o5X+zoTSer/tl7BYLBbrAta7VojzJSwWi8Xa3nqvPuMcYrFYLNYyVkf/HiCDzSwWi8Xa1OqD3dQ+vsiRWSwWi7WGNRppsu+TPlEWi8VirWF1fT2hbOss6SoUZrFYLNZmVpnz3scdnWmgslgsFms7K9d//oeuwyf+q+5gsVgs1qJWUyb09UN3xrBYLBZrRyuPP9bK9bTp/2GxWCzWjtaodCjLhCYaYLFYLNZ+1ri3s2JiexUbi8VisXa0buNUIBbRQBUSzLMAFovFYi1uje7iCXU0EOp1LBaLxbqANc1+A4vFYrGuZI2u4UmHsgAWi8ViLW0diH3Toe9+WSwWi7WuNbl7Lc8uaMgsFovF2tD6drBYLBaLxWKxWCwWi8VisVgsFovFYrFYn44fIpoMJJGu/X0AAAAASUVORK5CYII=
注意:这里编码后的base64字符串没有带有前端img标签解析时候的格式字符,需要在字符串前拼接:data:image/png;base64,
方可正常显示!!
检验
在线验证:http://imgbase64.duoshitong.com/
效果:微信扫码后结果就是:622921
本地生成方案
只需要修改部分关键代码即可实现,通过字节流的方式进行写入到磁盘,这里使用字节流直接操作的是文件对象,可以不用关闭流。
File file = new File("H:/test/456.png"); if (!file.exists()) { file.createNewFile(); } FileOutputStream outputStream = new FileOutputStream(file); MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
小结
学的东西要善于总结,这样才容易记忆与回顾,简单的一个生成二维码的方式,希望帮到你们!