springboot生成二维码到海报模板上
springboot生成二维码到海报模板上
QRCodeController
package com.ruoyi.web.controller.app;import com.google.zxing.WriterException;
import com.ruoyi.app.domain.Opportunity;
import com.ruoyi.app.tool.QRCodeGenerator;
import com.ruoyi.common.core.page.TableDataInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/app/qrcCode")
@Api(tags = "推广海报接口")
public class QRCodeController {@Autowiredprivate QRCodeGenerator qrCodeGenerator;@ApiOperation(value = "获取推广海报", notes = "获取推广海报")@GetMapping("/qrImage")public void generateQRCode(HttpServletResponse response, @RequestParam Map<String, String> params) throws Exception {String openid = params.get("openid");String xh = params.get("xh");if (openid == null || openid.isEmpty()) {throw new Exception("openid不能为空");}if (xh == null || xh.isEmpty()) {xh = "1";}// 改为自己的链接String url = "http://*******.cn/app/index/?parentId=" + openid;byte[] qrCodeBytes = qrCodeGenerator.generateQRCode(url, 290, 290, xh);response.setContentType(MediaType.IMAGE_PNG_VALUE);response.setHeader("Content-Disposition", "inline; filename=qrCode.png");response.setHeader("Cache-Control", "no-store");response.setHeader("Pragma", "no-cache");response.setContentLength(qrCodeBytes.length);try (OutputStream out = response.getOutputStream()) {out.write(qrCodeBytes);}}
}
QRCodeGenerator
package com.ruoyi.app.tool;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;@Component
public class QRCodeGenerator {public byte[] generateQRCode(String url, int qrCodeWidth, int qrCodeHeight, String xh) throws WriterException, IOException {// 生成二维码QRCodeWriter qrCodeWriter = new QRCodeWriter();Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置容错级别为高BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, qrCodeWidth, qrCodeHeight, hints);BufferedImage qrCodeImage = bitMatrixToImage(bitMatrix);// 加载背景图片ClassPathResource backgroundImageResource = new ClassPathResource("static/" + xh + ".jpg");BufferedImage backgroundImage = ImageIO.read(backgroundImageResource.getInputStream());// 创建包含背景图片的画布int combinedImageWidth = backgroundImage.getWidth();int combinedImageHeight = backgroundImage.getHeight();BufferedImage combinedImage = new BufferedImage(combinedImageWidth, combinedImageHeight, BufferedImage.TYPE_INT_RGB);Graphics2D combinedGraphics = combinedImage.createGraphics();combinedGraphics.drawImage(backgroundImage, 0, 0, null);// 将二维码放在背景图的左下角int qrCodeX = 930; // 二维码在背景图片中的X坐标int qrCodeY = combinedImageHeight - qrCodeHeight - 20; // 二维码在背景图片中的Y坐标// 添加红色边框int borderWidth = 2; // 边框宽度Color borderColor = Color.decode("#B11E4C"); // 边框颜色combinedGraphics.setColor(new Color(borderColor.getRed(), borderColor.getGreen(), borderColor.getBlue(), 0)); // 设置填充颜色为透明色combinedGraphics.fillRoundRect(qrCodeX - borderWidth, qrCodeY - borderWidth, qrCodeWidth + 2 * borderWidth, qrCodeHeight + 2 * borderWidth, 5, 5);combinedGraphics.setColor(borderColor); // 设置边框颜色combinedGraphics.drawRoundRect(qrCodeX - borderWidth, qrCodeY - borderWidth, qrCodeWidth + 2 * borderWidth, qrCodeHeight + 2 * borderWidth, 5, 5); // 绘制边框combinedGraphics.drawImage(qrCodeImage, qrCodeX, qrCodeY, null);// 将合成的图片转为字节数组ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();ImageIO.write(combinedImage, "png", byteArrayOutputStream);return byteArrayOutputStream.toByteArray();}private BufferedImage bitMatrixToImage(BitMatrix bitMatrix) {int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());}}return image;}
}
海报模板存放(不带二维码的图片):
把地址放到白名单中,无需token可以访问,然后就得到:
相关文章:

springboot生成二维码到海报模板上
springboot生成二维码到海报模板上 QRCodeController package com.ruoyi.web.controller.app;import com.google.zxing.WriterException; import com.ruoyi.app.domain.Opportunity; import com.ruoyi.app.tool.QRCodeGenerator; import com.ruoyi.common.core.page.TableDat…...

SEO长尾关键词布局优化法则
内容概要 在SEO优化体系中,长尾关键词的精准布局是突破流量瓶颈的关键路径。相较于竞争激烈的核心词,长尾词凭借其高转化率和低竞争特性,成为内容矩阵流量裂变的核心驱动力。本节将系统梳理长尾关键词布局的核心逻辑框架,涵盖从需…...

python:trimesh 用于 STL 文件解析和 3D 操作
python:trimesh 是一个用于处理三维模型的库,支持多种格式的导入导出,比如STL、OBJ等,还包含网格操作、几何计算等功能。 Python Trimesh 库使用指南 安装依赖库 pip install trimesh Downloading trimesh-4.6.8-py3-none-any.w…...

应急响应基础模拟靶机-security2
PS:杰克创建的流量包(result.pcap)在root目录下,请根据已有信息进行分析 1、首个攻击者扫描端口使用的工具是? 2、后个攻击者使用的漏洞扫描工具是? 3、攻击者上传webshell的绝对路径及User-agent是什么? 4、攻击者反弹shell的…...
ROS 2 FishBot PID控制电机代码
#include <Arduino.h> #include <Wire.h> #include <MPU6050_light.h> #include <Esp32McpwmMotor.h> #include <Esp32PcntEncoder.h>Esp32McpwmMotor motor; // 创建一个名为motor的对象,用于控制电机 Esp32PcntEncoder enco…...
Bash 字符串语法糖详解
Bash 作为 Linux 和 Unix 系统中最常用的 Shell 之一,其字符串处理能力是脚本开发者的核心技能之一。为了让字符串操作更高效、更直观,Bash 提供了丰富的语法糖(syntactic sugar)。这些语法糖通过简洁的语法形式,隐藏了…...

OpenCV定位地板上的书
任务目标是将下面的图片中的书本找出来: 使用到的技术包括:转灰度图、提取颜色分量、二值化、形态学、轮廓提取等。 我们尝试先把图片转为灰度图,然后二值化,看看效果: 可以看到,二值化后,书的…...
C++ string初始化、string赋值操作、string拼接操作
以下介绍了string的六种定义方式,还有很多,这个只是简单举例 #include<iostream>using namespace std;int main() {//1 无参构造string s1;cout << s1 << endl;//2 初始化构造string s2 ({h, h, l, l, o});cout << s2 <<…...
linux动态占用cpu脚本、根据阈值增加占用或取消占用cpu的脚本、自动检测占用脚本状态、3脚本联合套用。
文章目录 说明流程占用脚本1.0版本使用测试占用脚本2.0版本使用测试测试脚本使用测试检测脚本使用测试脚本说明书启动说明停止说明内存占用cpu内存成品任务测试说明 cpu占用实现的功能整体流程 1、先获取当前实际使用率2、设置一个最低阈值30%,一个最高阈值80%、一个需要增加的…...

NHANES稀有指标推荐:MedHi
文章题目:Association of dietary live microbe intake with frailty in US adults: evidence from NHANES DOI:10.1016/j.jnha.2024.100171 中文标题:美国成人膳食活微生物摄入量与虚弱的相关性:来自 NHANES 的证据 发表杂志&…...
无人机空中物流优化:用 Python 打造高效配送模型
友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…...

关于我在实现用户头像更换时遇到的图片上传和保存的问题
目录 前言 前端更换头像 后端处理 文件系统存储图片 数据库存储图片 处理图片文件 生成图片名 保存图片 将图片路径存储到数据库 完整代码 总结 前言 最近在实现一个用户头像更换的功能,但是因为之前并没有处理过图片的上传和保存,所以就开始…...

10.二叉搜索树中第k小的元素(medium)
1.题目链接: 230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)230. 二叉搜索树中第 K 小的元素 - 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数…...

AlimaLinux设置静态IP
通过nmcli命令来操作 步骤 1:确认当前活动的网络接口名称 首先,需要确认当前系统中可用的网络接口名称。可以使用以下命令查看: nmcli device步骤 2:修改配置以匹配正确的接口名称 sudo nmcli connection modify ens160 ipv4.…...

滑动窗口——将x减到0的最小操作数
题目: 这个题如果我们直接去思考方法是很困难的,因为我们不知道下一步是在数组的左还是右操作才能使其最小。正难则反,思考一下,无论是怎么样的,最终这个数组都会分成三个部分左中右,而左右的组合就是我们…...

基于SpringBoot的抽奖系统测试报告
一、编写目的 本报告为抽奖系统测试报告,本项目可用于团体抽奖活动,包括了用户注册,用户登录,修改奖项以及抽奖等功能。 二、项目背景 抽奖系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据&…...

服务器mysql连接我碰到的错误
搞了2个下午,总算成功了 我在服务器上使用docker部署了java项目与mysql,但mysql连接一直出现问题 1.首先,我使用的是localhost连接,心想反正都在服务器上吧。 jdbc:mysql://localhost:3306/fly-bird?useSSLfalse&serverTime…...

【Part 2安卓原生360°VR播放器开发实战】第四节|安卓VR播放器性能优化与设备适配
《VR 360全景视频开发》专栏 将带你深入探索从全景视频制作到Unity眼镜端应用开发的全流程技术。专栏内容涵盖安卓原生VR播放器开发、Unity VR视频渲染与手势交互、360全景视频制作与优化,以及高分辨率视频性能优化等实战技巧。 📝 希望通过这个专栏&am…...
TIME - MoE 模型代码 4——Time-MoE-main/run_eval.py
源码:https://github.com/Time-MoE/Time-MoE 这段代码是一个用于评估 Time-MoE 模型性能的脚本,它支持分布式环境下的模型评估,通过计算 MSE 和 MAE 等指标来衡量模型在时间序列预测任务上的表现。代码的核心功能包括:模型加载、…...
数字孪生概念
数字孪生(Digital Twin) 是指通过数字技术对物理实体(如设备、系统、流程或环境)进行高保真建模和实时动态映射,实现虚实交互、仿真预测和优化决策的技术体系。它是工业4.0、智慧城市和数字化转型的核心技术之一。 1. …...

从知识图谱到精准决策:基于MCP的招投标货物比对溯源系统实践
前言 从最初对人工智能的懵懂认知,到逐渐踏入Prompt工程的世界,我们一路探索,从私有化部署的实际场景,到对DeepSeek技术的全面解读,再逐步深入到NL2SQL、知识图谱构建、RAG知识库设计,以及ChatBI这些高阶应…...
DAMA车轮图
DAMA车轮图是国际数据管理协会(DAMA International)提出的数据管理知识体系(DMBOK)的图形化表示,它以车轮(同心圆)的形式展示了数据管理的核心领域及其相互关系。以下是基于用户提供的关键词对D…...

图形化编程革命:iVX携手AI 原生开发范式
一、技术核心:图形化编程的底层架构解析 1. 图形化开发的效率优势:代码量减少 72% 的秘密 传统文本编程存在显著的信息密度瓶颈。以 "按钮点击→条件判断→调用接口→弹窗反馈" 流程为例,Python 实现需定义函数、处理缩进并编写 …...
线程池使用ThreadLocal注意事项
ThreadLocal和线程池都是Java中处理多线程的重要工具,但它们在结合使用时需要特别注意一些问题。 ThreadLocal简介 ThreadLocal提供了线程局部变量,每个线程都有自己独立的变量副本,互不干扰。 基本用法: private static fina…...

JAVA EE_网络原理_网络层
晨雾散尽,花影清晰。 ----------陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:数据库Mysql_联…...

森林生态学研究深度解析:R语言入门、生物多样性分析、机器学习建模与群落稳定性评估
在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…...

AI大模型学习十八、利用Dify+deepseekR1 +本地部署Stable Diffusion搭建 AI 图片生成应用
一、说明 最近在学习Dify工作流的一些玩法,下面将介绍一下Dify Stable Diffusion实现文生图工作流的应用方法 Dify与Stable Diffusion的协同价值 Dify作为低代码AI开发平台的优势:可视化编排、API快速集成 Stable Diffusion的核心能力:高效…...

关于chatshare.xyz激活码使用说明和渠道指南!
chatshare.xyz和chatshare.biz是两个被比较的平台,分别在其功能特性和获取渠道有所不同。 本文旨在探讨它们的差异,以及提供如何获取并使用的平台信息。此外,还提及其他一些相关资源和模板推荐以满足用户需求。 主要区分关键点 1、chatshar…...
【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
RAII是什么?
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C编程中的一项非常重要且经典的设计思想,也是现代C资源管理的基石。它主要解决资源的自动管理与释放问题,从而帮助程序员避免资源泄漏、悬空指针等常…...