Java生成带log的二维码

生成二维码案例

1.引入依赖
<!-- zxing生成二维码 -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version>
</dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version>
</dependency>
2.生成二维码工具包

/*** 二维码工具* @Author:debug (SteadyJack)* @Link: weixin-> debug0868  qq-> 1948831260* @Date: 2020/11/16 22:38**/
public class QRCodeUtil {private static final Logger log= LoggerFactory.getLogger(QRCodeUtil.class);//CODE_WIDTH:二维码宽度,单位像素private static final int CODE_WIDTH = 400;//CODE_HEIGHT:二维码高度,单位像素private static final int CODE_HEIGHT = 400;//FRONT_COLOR:二维码前景色,0x000000 表示黑色private static final int FRONT_COLOR = 0x000000;//BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色//演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白private static final int BACKGROUND_COLOR = 0xFFFFFF;public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) {try {if (StringUtils.isBlank(content) || StringUtils.isBlank(fileName)) {return;}content = content.trim();if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {//二维码图片存在目录为空,默认放在桌面...codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();}if (!codeImgFileSaveDir.exists()) {//二维码图片存在目录不存在,开始创建...codeImgFileSaveDir.mkdirs();}//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);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 content  :二维码内容* @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream*/public static void createCodeToOutputStream(String content, OutputStream outputStream) {try {if (StringUtils.isBlank(content)) {return;}content = content.trim();//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);//图片路径addQrCodeLogo(bufferedImage,new File("E://shFiles//QRCode//20231213151849.png"));//区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中ImageIO.write(bufferedImage, "png", outputStream);log.info("二维码图片生成到输出流成功...");} catch (Exception e) {e.printStackTrace();}}//核心代码-生成二维码private static BufferedImage getBufferedImage(String content) throws WriterException {//com.google.zxing.EncodeHintType:编码提示类型,枚举类型Map<EncodeHintType, Object> hints = new HashMap();//EncodeHintType.CHARACTER_SET:设置字符编码类型hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//EncodeHintType.ERROR_CORRECTION:设置误差校正//ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction//不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近hints.put(EncodeHintType.MARGIN, 1);MultiFormatWriter multiFormatWriter = new MultiFormatWriter();BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);for (int x = 0; x < CODE_WIDTH; x++) {for (int y = 0; y < CODE_HEIGHT; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);}}return bufferedImage;}/*** 二维码下载方法* @param url* @param fileName* @param request* @param response*/public static void downFile(String url, String fileName, HttpServletRequest request, HttpServletResponse response) {try {//1.定义ContentType为("multipart/form-data")让浏览器自己解析文件格式response.setContentType("multipart/form-data");//2.中文名转码//response.setHeader("Content-disposition", "attachment; filename=\""+encodeChineseDownloadFileName(request, fileName+".xlsx") +"\"");response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));//获得文件File file = new File(url+fileName);FileInputStream in = new FileInputStream(file);//3.将文件写入缓冲区OutputStream(out)OutputStream out = new BufferedOutputStream(response.getOutputStream());int b = 0;byte[] buffer = new byte[2048];while ((b=in.read(buffer)) != -1){//4.将缓冲区文件输出到客户端(out)out.write(buffer,0,b);}in.close();out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}/*** 给二维码添加logo* @Date 2023/09/24 22:33* @Param [bufferedImage, logoFile]* @return java.awt.image.BufferedImage*/public static BufferedImage addQrCodeLogo(BufferedImage bufferedImage, File logoFile) throws IOException {Graphics2D graphics = bufferedImage.createGraphics();int matrixWidth = bufferedImage.getWidth();int matrixHeigh = bufferedImage.getHeight();// 读取logo图片文件BufferedImage logo = ImageIO.read(logoFile);int logoWidth = logo.getWidth();int logoHeight = logo.getHeight();//  计算logo放置位置int x = bufferedImage.getWidth()  / 5*2;int y = bufferedImage.getHeight() / 5*2;int width = matrixWidth / 5;int height = matrixHeigh / 5;// 开始绘制图片graphics.drawImage(logo, x, y, width, height, null);graphics.drawRoundRect(x, y, logoWidth, logoHeight, 15, 15);graphics.setStroke(new BasicStroke(5.0F, 1, 1));graphics.setColor(Color.white);graphics.drawRect(x, y, logoWidth, logoHeight);graphics.dispose();bufferedImage.flush();return bufferedImage;}}
3.Controller 中调用生成二维码工具包
@RestController
@RequestMapping("/qrCode")
public class QrCodeController {private static final String RootPath="H:\\shFiles\\QRCode";private static final String FileFormat=".png";private static final ThreadLocal<SimpleDateFormat> LOCALDATEFORMAT=ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss"));//生成二维码并将其存放于本地目录@PostMapping("generate/file")public AjaxResult generateV1(String content){try {final String fileName=LOCALDATEFORMAT.get().format(new Date());File file = null;QRCodeUtil.createCodeToFile(content,file,fileName+FileFormat);}catch (Exception e){return AjaxResult.error(e.getMessage());}return AjaxResult.success();}//生成二维码并将其返回给前端调用者@PostMapping("generate/img")public AjaxResult generateV2(String content,HttpServletResponse servletResponse){try {QRCodeUtil.createCodeToOutputStream(content,servletResponse.getOutputStream());}catch (Exception e){return AjaxResult.error(e.getMessage());}return AjaxResult.success();}}
4.在postman测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.了解数据结构和算法

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

前端自定义验证码,校验验证码,验证码时效

最近做的项目&#xff0c;不需要后端接口&#xff0c;只需要前端验证&#xff0c;如图 初始页面 获取验证码 验证码的文件&#xff0c;直接复制就行 <template><div class"s-canvas"><canvasid"s-canvas":width"contentWidth":…

HTML---列表.表格.媒体元素

文章目录 目录 文章目录 一.列表 无序列表 有序列表 自定义列表 二.表格 表格的兼并 三.媒体元素 视频标签 音频标签 四.内联框架 五.拓展标签 总结 一.列表 无序列表 HTML中的无序列表&#xff08;Unordered List&#xff09;用于显示一组项目&#xff0c;每个项目之前…

【Pytorch】Transposed Convolution

文章目录 1 卷积2 反/逆卷积3 MaxUnpool / ConvTranspose4 encoder-decoder5 可视化 学习参考来自&#xff1a; 详解逆卷积操作–Up-sampling with Transposed Convolution PyTorch使用记录 https://github.com/naokishibuya/deep-learning/blob/master/python/transposed_co…

每天五分钟计算机视觉:Inception网络是由多个Inception模块构成

本文重点 inception从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。可以简单的理解为Inception 网络是由一个一个的Inception模块构建成的,我们来看一下。 Inception模块 如上就是Inception模块的 通过一个1…

采埃孚4D成像雷达拆解

1 基本信息 品牌&#xff1a;海外Tier1采埃孚 • 应用&#xff1a;上汽飞凡中高端纯电平台 • 数量&#xff1a;单车2个&#xff0c;安装在前后保内部 • 最远探测距离&#xff1a;350米 拆解来看&#xff0c;4D雷达主要可以分为4个部分&#xff0c;分别为数字接口板及结构件…

JAVA对文档加密

当 Word 文档中包含无法公开的机密信息时&#xff0c;我们可以对其进行加密&#xff0c;使其在没有密码的情况下无法打开。本文将向您介绍如何使用 Spire.Doc for Java 加密 Word 文档和移除 Word 密码保护。 加密 Word 文档删除 Word 密码保护 安装 Spire.Doc for Java 首先…

eclipse连接mysql数据库(下载eclipse,下载安装mysql,下载mysql驱动)

前言&#xff1a; 使用版本&#xff1a;eclipse2017&#xff0c;mysql5.7.0&#xff0c;MySQL的jar建议使用最新的&#xff0c;可以避免警告&#xff01; 1&#xff1a;下载安装&#xff1a;eclipse&#xff0c;mysql在我之前博客中有 http://t.csdnimg.cn/UW5fshttp://t.csdn…

云上丝绸之路| 云轴科技ZStack成功实践精选(西北)

古有“丝绸之路” 今有丝绸之路经济带 丝路焕发新生&#xff0c;数智助力经济 云轴科技ZStack用“云”护航千行百业 沿丝绸之路&#xff0c;领略西北数字化。 古丝绸之路起点-陕西 集历史与现代交融&#xff0c;不仅拥有悠久的历史文化积淀&#xff0c;而且现代化、数字化发…

【setDS】牛客小白月赛83 E

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先&#xff0c;一个必要步骤是把它转化为两个序列&#xff0c;这样就变成了一个序列DS问题 我们的答案是一个位置 pos 后面还有多少位置和这个位置的颜色相同&#xff0c;考虑得到这个答案我们需要维护什么东西 我们只需要…

Jmeter,提取响应体中的数据:正则表达式、Json提取器

一、正则表达式 1、线程组--创建线程组&#xff1b; 2、线程组--添加--取样器--HTTP请求&#xff1b; 3、Http请求--添加--后置处理器--正则表达式提取器&#xff1b; 4、线程组--添加--监听器--查看结果树&#xff1b; 5、线程组--添加--取样器--调试取样器。 响应体数据…

Axure动态面板的使用以及示例分享

目录 一. 什么是动态面板 二. 动态面板教程——以轮播图为例 2.1 创建动态面板 2.2 动态面板自适应大小 2.3 重复状态&#xff0c;将图片导入 2.4 添加交互事件——图片切换 2.5 效果展示 三. 多方式登录示例展示 四. 后台主界面左侧菜单栏示例展示 一. 什么是动态面板…

【C语言】C的面向对象

一、BREW接口实现 高通的BREW&#xff08;Binary Runtime Environment for Wireless&#xff09;是一个早期为手机设备开发的应用程序平台&#xff0c;用于开发在CDMA手机上运行的软件。尽管这个平台目前已经不太流行&#xff0c;但是在其使用高峰时期&#xff0c;开发者需要使…

vue2 tailwindcss jit模式下热更新失效

按照网上教程安装的tailwindcss&#xff0c;但是修改类名后热更新的时候样式没有生效&#xff0c;参考了大佬的文章&#xff0c;解决了该问题。 安装cross-env 修改前 "dev": " vue-cli-service serve", 修改后 "dev": "cross-env TAILWIN…

动手学深度学习-自然语言处理-预训练

词嵌入模型 将单词映射到实向量的技术称为词嵌入。 为什么独热向量不能表达词之间的相似性&#xff1f; 自监督的word2vec。 word2vec将每个词映射到一个固定长度的向量&#xff0c;这些向量能更好的表达不同词之间的相似性和类比关系。 word2vec分为两类&#xff0c;两类…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时&#xff0c;工具在幻灯片的左下方&#xff0c;本工具在幻灯片的右侧&#xff0c;可以移动&#xff0c;可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等&#xff0c;点画笔切换橡皮擦&#xff0c;点插入绘图&#xff0c;将背景…

车载以太网笔记

文章目录 以太网协议分层协议中间设备子网掩码物理层测试内容比较杂,后续会整理。 以太网协议分层 协议 中间设备

智能高效|AIRIOT智慧货运管理解决方案

随着全球贸易的增加和消费需求的不断扩大&#xff0c;货运行业面临更大的压力&#xff0c;传统货运行业运输效率低下、信息不透明&#xff0c;往往存在如下的运维问题和管理痛点&#xff1a; 无法实时定位和追踪信息&#xff1a;无法提供实时的货物位置信息&#xff0c;以便随…

布局前沿技术,紫光展锐推动6G创新融合发展

随着5G进入规模化商用阶段&#xff0c;6G研究已在全球范围内拉开帷幕。2023年6月&#xff0c;ITU发布了《IMT面向2030及未来发展的框架和总体目标建议书》&#xff0c;在升级5G三大应用场景的同时&#xff0c;扩展出三个跨领域场景&#xff0c;形成6G的六大应用场景&#xff0c…

Axios入门案例——后端学习

目录 后端准备 导入依赖 解决跨域 User实体类 DemoController测试接口 前端准备 项目结构 axios.js axios.html 开始测试 后端结果 前端结果 后端准备 导入依赖 案例会用到以下的三个依赖。 <dependency><groupId>org.springframework.boot</gro…