Springboot生成二维码,怎么搞?
作者 |带妳心菲
来源 | urlify.cn/emE3ya
我们使用两种方式 , 去生成二维码 , 但是其实 , 二维码的生成基础 , 都是zxing包 , 这是Google开源的一个包 , 第一种是使用原始的zxing方式去实现 , 第二种是使用hutool来实现 , hutool其实也是对于zxing的一个封装 , 但是封装前后 , 确实比较简单了 。
Zxing原生方式添加依赖二维码生成工具类下面是把生成二维码的方法 , 封装到了QRCodeUtil的类之中 , 这个方法看起来还是比较多的 , 但是也谈不上太复杂 , 主要是对于BufferedImage生成图片 , 然后就是ImageIO.write()方法 , write的位置 , 可以是普通的磁盘文件 , 也可以是web的流 , 我们使用web流的时候 , 就需要添加com.google.zxing-javase的依赖 。
@Component@Slf4jpublic class QRCodeUtil {/*** CODE_WIDTH:二维码宽度 , 单位像素* CODE_HEIGHT:二维码高度 , 单位像素* FRONT_COLOR:二维码前景色 , 0x000000 表示黑色* BACKGROUND_COLOR:二维码背景色 , 0xFFFFFF 表示白色* 演示用 16 进制表示 , 和前端页面 CSS 的取色是一样的 , 注意前后景颜色应该对比明显 , 如常见的黑白*/private static final int CODE_WIDTH = 400;private static final int CODE_HEIGHT = 400;private static final int FRONT_COLOR = 0x000000;private static final int BACKGROUND_COLOR = 0xFFFFFF;/*** @param codeContent二维码参数内容 , 如果是一个网页地址 , 如则 微信扫一扫会直接进入此地址 ,如果是一些参数 , 如*1541656080837 , 则微信扫一扫会直接回显这些参数值* @param codeImgFileSaveDir 二维码图片保存的目录,如 D:/codes* @param fileName二维码图片文件名称 , 带格式,如 123.png*/public static void createCodeToFile(String codeContent, File codeImgFileSaveDir, String fileName) {try {if (codeContent == null || "".equals(codeContent)) {log.info("二维码内容为空 , 不进行操作...");return;}codeContent = codeContent.trim();if (codeImgFileSaveDir == null || codeImgFileSaveDir.isFile()) {codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();log.info("二维码图片存在目录为空 , 默认放在桌面...");}if (!codeImgFileSaveDir.exists()) {codeImgFileSaveDir.mkdirs();log.info("二维码图片存在目录不存在 , 开始创建...");}if (fileName == null || "".equals(fileName)) {fileName = new Date().getTime() + ".png";log.info("二维码图片文件名为空 , 随机生成 png 格式图片...");}BufferedImage bufferedImage = getBufferedImage(codeContent);/** javax.imageio.ImageIO:java扩展的图像IO* write(RenderedImage im, String formatName, File output)*im:待写入的图像 ,formatName:图像写入的格式 , output:写入的图像文件 , 文件不存在时会自动创建*/File codeImgFile = new File(codeImgFileSaveDir, fileName);ImageIO.write(bufferedImage, "png", codeImgFile);log.info("二维码图片生成成功:" + codeImgFile.getPath());} catch (Exception e) {e.printStackTrace();}}/*** 生成二维码并输出到输出流, 通常用于输出到网页上进行显示* 输出到网页与输出到磁盘上的文件中 , 区别在于最后一句 ImageIO.write* write(RenderedImage im,String formatName,File output):写到文件中* write(RenderedImage im,String formatName,OutputStream output):输出到输出流中** @param codeContent:二维码内容* @param outputStream :输出流 , 比如 HttpServletResponse 的 getOutputStream*/public static void createCodeToOutputStream(String codeContent, OutputStream outputStream) {try {if (codeContent == null || "".equals(codeContent.trim())) {log.info("二维码内容为空 , 不进行操作...");return;}codeContent = codeContent.trim();BufferedImage bufferedImage = getBufferedImage(codeContent);/** 区别就是以一句 , 输出到输出流中 , 如果第三个参数是 File , 则输出到文件中*/ImageIO.write(bufferedImage, "png", outputStream);log.info("二维码图片生成到输出流成功...");} catch (Exception e) {e.printStackTrace();log.error("发生错误: {}!", e.getMessage());}}private static BufferedImage getBufferedImage(String codeContent) throws WriterException {/** com.google.zxing.EncodeHintType:编码提示类型,枚举类型* EncodeHintType.CHARACTER_SET:设置字符编码类型* EncodeHintType.ERROR_CORRECTION:设置误差校正* ErrorCorrectionLevel:误差校正等级 , L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction*不设置时 , 默认为 L 等级 , 等级不一样 , 生成的图案不同 , 但扫描的结果是一样的* EncodeHintType.MARGIN:设置二维码边距 , 单位像素 , 值越小 , 二维码距离四周越近*/Map
- 二维码|村网通?澳大利亚一州推出疫情追踪二维码 还考虑采用人脸识别和地理定位
- 二维码|扫了“清粉”程序二维码后,微信竟成“傀儡”
- 钓鱼|团伙用二维码引诱进钓鱼网站 在直播平台盗“快手币”套现
- SpringBoot+MyBatis+MySQL读写分离实现
- Audiobook Builder Mac(有声书生成工具)
- SpringBoot构造流程源码分析:Web应用类型推断
- 搭建私有Sentry日志收集系统并集成到springboot
- 开发好物推荐9之自动生成在线接口+文档-Knife4j
- 登上|AI生成肖像画,精细到毛发!北大校友最新研究收割2.8k星标,还登上了ICPR 2020
- 开发好物推荐10之自动批量生成测试数据TstDataB
