当前位置: 首页 > news >正文

Spring Boot + hutool 创建海报图片

Spring Boot + hutool 创建海报图片

/*** 分享,生成图片* @param id* @return*/@GetMapping("/getShareImg")public void getShareImg(String id,HttpServletResponse response) throws IOException {CouponConsignSaleClassify byId = couponConsignSaleClassifyService.getById(id);if(byId == null){throw new GlobalException("查询 id 为空 ");}CouponConsignSaleGoods one = couponConsignSaleGoodsService.lambdaQuery().eq(CouponConsignSaleGoods::getClassifyId, id).ge(CouponConsignSaleGoods::getStock, 1).orderByAsc(CouponConsignSaleGoods::getPurchasePrice).last(" limit 0,1").one();/*final int w = 270 * 2;final int h = 340 * 2;*/final int w = 405;final int h = 550;BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);Graphics2D graphics2D = bi.createGraphics();//绘制白色背景graphics2D.setColor(Color.white);graphics2D.fillRect(0, 0, w, h);//释放资源graphics2D.dispose();String tempPath = System.getProperty("java.io.tmpdir");//System.out.println(tempPath);File outputfile = new File(tempPath+"poster.jpg");ImageIO.write(bi, "jpg", outputfile);//分类图片Image image = ImgUtil.getImage(new URL(transformStyle(byId.getImg())));File scaleImg = new File(tempPath+"imgScale.jpg");ImgUtil.scale(image,scaleImg,1.2f);BufferedImage read = ImageIO.read(scaleImg);//画图片ImgUtil.pressImage(outputfile,outputfile,read,0,-140,1f);//商品名称String name = byId.getName();ImgUtil.pressText(outputfile,outputfile,name,Color.black,new Font("黑体", Font.PLAIN, 20),-170+(name.length() * 10),0,0.8f);String lowestPrice=byId.getMaxPrice()==null?"":byId.getMaxPrice().toPlainString();if(one != null){lowestPrice = one.getPrice().toPlainString();}//最低价格String p="最低价格:"+lowestPrice;ImgUtil.pressText(outputfile,outputfile,p,Color.red,new Font("黑体", Font.PLAIN, 22),-200 + (p.length() * 11),35,0.8f);//原价ImgUtil.pressText(outputfile,outputfile,"原价:"+(byId.getMaxPrice()==null?"-":byId.getMaxPrice()),Color.black,new Font("黑体", Font.PLAIN, 15),50,30,0.8f);String url="http://qy.gsjf.cc/h5/#/pages/buy/consignBuy/consignBuy?id="+byId.getId();String qrFile=tempPath+"qrFile.jpg";File file = FileUtil.file(qrFile);//生成二维码QrCodeUtil.generate(url, 180, 180,file);BufferedImage qrFile0 = ImageIO.read(file);//显示二维码ImgUtil.pressImage(outputfile,outputfile,qrFile0,0,130,1f);//显示文字ImgUtil.pressText(outputfile,outputfile,"识别二维码查看详情",Color.black,new Font("黑体", Font.PLAIN, 16),-07,250,0.6f);/* ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(bi, "jpg", os);*/byte[] bFile = Files.readAllBytes(outputfile.toPath());response.setContentType("image/jpg"); //设置返回的文件类型OutputStream respOut = response.getOutputStream();respOut.write(bFile);respOut.flush();respOut.close();}/*** 对中文字符进行UTF-8编码* @param source 要转义的字符串* @return* @throws UnsupportedEncodingException*/public static String transformStyle(String source) throws UnsupportedEncodingException{char[] arr = source.toCharArray();StringBuilder sb = new StringBuilder();for(int i = 0; i < arr.length; i++){char temp = arr[i];if(isChinese(temp)){sb.append(URLEncoder.encode("" + temp, "UTF-8"));continue;}sb.append(arr[i]);}return sb.toString();}/*** 判断是不是中文字符* @param c* @return*/public static boolean isChinese(char c){Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);if(ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS){return true;}return false;}

效果

相关文章:

Spring Boot + hutool 创建海报图片

Spring Boot hutool 创建海报图片 /*** 分享,生成图片* param id* return*/GetMapping("/getShareImg")public void getShareImg(String id,HttpServletResponse response) throws IOException {CouponConsignSaleClassify byId couponConsignSaleClassifyService…...

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…...

Linux(Centos)上使用crontab实现定时任务(定时执行脚本)

场景 Windows中通过bat定时执行命令和mysqldump实现数据库备份&#xff1a; Windows中通过bat定时执行命令和mysqldump实现数据库备份_mysqldump bat-CSDN博客 上面讲windows中使用bat实现定时任务的方式&#xff0c;如果是在linux上可以通过crontab实现。 cron是服务名称。…...

【Leetcode合集】20. 有效的括号

20. 有效的括号 20. 有效的括号 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串…...

OpenGL 绘制线(Qt)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里同样对OpenGL中的绘制线操作进行封装,便于后续的操作,很多形状也都是基于线来生成的,如圆形等。 二、实现代码 LineDrawable.h #ifndef LINE_DRAWABLE_H #define LINE_DRAWABLE_H#include...

Java | 多线程并发编程CountDownLatch实践

关注&#xff1a;CodingTechWork 引言 在一次数据割接需求中&#xff0c;数据需要通过编程的方式进行转移割接到新平台&#xff0c;此时若串行化方式&#xff0c;无疑会拉锯此次战斗&#xff0c;所以首当其冲要使用并发编程来降低割接时长。  本次主要考虑使用CountDownLatc…...

分布式定时任务系列6:XXL-job触发日志过大引发的CPU告警

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …...

Spark RDD、DataFrame和Dataset的区别和联系

一、三种数据介绍 是Spark中的三种不同的数据结构&#xff0c;它们都可以用于分布式数据处理&#xff0c;但是它们的实现方式和使用方法略有不同。 RDD&#xff08;弹性分布式数据集&#xff09; RDD是Spark最初的核心数据结构&#xff0c;它是一个分布式的、只读的、可容错的…...

代码随想录算法训练营第四十五天|139.单词拆分、背包问题总结

LeetCode 139. 单词拆分 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 这道题使用完全背包来实现&#xff0c;我们首先考虑字符串是否可以由字符串列表组成&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n个位置时是否能…...

深度学习卫星遥感图像检测与识别 -opencv python 目标检测 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…...

wxWidgets 3.2.4发布 —— 发布于2023年11月11日

稳定的3.2系列中的另一个版本现在可以在GitHub上获得。您可以在那里找到包含库源代码和文档的归档文件&#xff0c;以及所选Windows编译器&#xff08;如Microsoft Visual C、MinGW-w64和TDM-GCC&#xff09;的二进制文件。您还可以阅读此版本的更新文档&#xff0c;特别是&…...

PyQt6运行QTDesigner生成的ui文件程序

2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…...

基于mediapipe的人手21点姿态检测模型—CPU上检测速度惊人

前期的文章,我们介绍了MediaPipe对象检测与对象分类任务,也分享了MediaPipe的人手手势识别。在进行人手手势识别前,MediaPipe首先需要进行人手的检测与人手坐标点的检测,经过以上的检测后,才能把人手的坐标点与手势结合起来,进行相关的手势识别。 MediaPipe人手坐标点检测…...

系统架构设计: 21 论敏捷软件开发方法及其应用

论敏捷软件开发方法及其应用 请围绕“敏捷软件开发方法及其应用”论题,依次从以下三个方面进行论述。 ①简述你所参与开发的运用了敏捷技术的项目,以及你所担任的工作; ②分析并讨论敏捷<...

【深度学习】脸部修复,CodeFormer,论文,实战

代码&#xff1a; https://github.com/sczhou/CodeFormer https://huggingface.co/spaces/sczhou/CodeFormer 论文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目录 论文摘要1 引言2 相关工…...

OpenGL_Learn14(光照贴图)

1. 漫反射贴图 在光照场景中&#xff0c;它通常叫做一个漫反射贴图(Diffuse Map)&#xff08;3D艺术家通常都这么叫它&#xff09;&#xff0c;它是一个表现了物体所有的漫反射颜色的纹理图像。 我们会将纹理储存为Material结构体中的一个sampler2D 。我们将之前定义的vec3漫反…...

【JVM精讲与GC调优教程(概述)】

如何理解虚拟机(JVM)跨语言的平台 java虚拟机根本不关心运行在其内部的程序到底是使用何种编程语言编写的,他只关心“字节码”文件。 java不是最强大的语言,但是JVN是最强大的虚拟机。 不存在内存溢出? 内存泄露? JAVA = (C++)–; 垃圾回收机制为我们打理了很多繁琐的…...

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

Stm32l071原理图&#xff1a; PA11与PA12连接着UNL2803 ULN2803是一种集成电路芯片&#xff0c;通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列&#xff0c;当输入引脚&#xff08;IN1至IN8&#xff09;被连接到正电源时&#xff0c;相应的输出引脚&#xff…...

python之pyqt专栏2-项目文件解析

项目结构 在上一篇文章python之pyqt专栏1-环境搭建&#xff0c;创建新的pyqt项目&#xff0c;下面我们来看一下这个项目下的文件。 从下面的文件结构图可以看到&#xff0c;该项目下有3个文件&#xff0c;untitled.ui,untitled.py 以及main.py。 QtDesigner可以UI界面的方式&am…...

Kafka 集群如何实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…...

【2024最硬核AI数据层教程】:用EF Core 10原生向量API构建低延迟RAG系统,实测P99<87ms

第一章&#xff1a;EF Core 10向量搜索扩展的演进与核心价值EF Core 10正式将向量搜索能力纳入官方生态&#xff0c;标志着ORM框架首次原生支持语义检索场景。这一演进并非简单叠加功能&#xff0c;而是深度整合了数据库向量索引、相似度计算与LINQ查询管道&#xff0c;使开发者…...

利用systemd定时器实现Ubuntu服务精准延迟启动

1. 为什么需要精准延迟启动服务&#xff1f; 在Ubuntu服务器管理中&#xff0c;经常会遇到这样的场景&#xff1a;某个关键服务启动得太早&#xff0c;结果因为依赖项没准备好而频繁报错。比如数据库服务需要等存储设备挂载完成&#xff0c;或者Web应用需要等数据库服务就绪。传…...

RH850中断配置避坑指南:从TAUB定时器到CAN通信的实战代码解析

RH850中断配置避坑指南&#xff1a;从TAUB定时器到CAN通信的实战代码解析 在汽车电子和工业控制领域&#xff0c;RH850系列微控制器凭借其卓越的实时性能和丰富的外设资源&#xff0c;成为众多关键系统的首选。中断系统作为实时响应的核心机制&#xff0c;其配置质量直接决定了…...

SpringBoot项目里那些不起眼的路径匹配规则,你真的用对了吗?

SpringBoot路径匹配的深度实践&#xff1a;从Ant规则到安全防御 在SpringBoot项目中&#xff0c;路径匹配就像空气一样无处不在却又容易被忽视。直到某天深夜&#xff0c;我被紧急电话惊醒——生产环境出现严重的安全漏洞&#xff0c;攻击者通过精心构造的URL绕过了权限验证。排…...

深入电机‘内心’:拆解FOC无感算法中的BEMF与磁链观测器(从公式到代码)

深入电机‘内心’&#xff1a;拆解FOC无感算法中的BEMF与磁链观测器&#xff08;从公式到代码&#xff09; 当电机控制工程师第一次接触无感FOC算法时&#xff0c;往往会被各种观测器模型弄得晕头转向。为什么磁链能反映转子位置&#xff1f;电压模型和电流模型究竟孰优孰劣&am…...

OpenSpec 技术架构深度解析:规范驱动 AI 编程的工程化实践

随着大语言模型(LLM)能力的飞跃式提升,AI 编程助手已经从概念走向生产。Claude Code、Cursor、Copilot 等工具让开发者能够通过自然语言指令快速生成代码,极大地提升了开发效率。然而,这种"氛围编程"(Vibe Coding)模式在带来便利的同时,也暴露出严重的工程化…...

从车窗升降到自动驾驶:聊聊LIN总线和CAN总线在实车里的那些事儿

从车窗升降到自动驾驶&#xff1a;LIN与CAN总线的汽车神经脉络解密 清晨七点十五分&#xff0c;当你坐进驾驶座按下车窗按钮时&#xff0c;可能不会想到这个简单的动作正触发着一场精密的电子交响乐。而在三公里外的高速公路上&#xff0c;前方车辆突然刹车时&#xff0c;你的爱…...

神经网络优化VoIP自适应延迟:小波-MLP混合模型实践

1. 神经网络在VoIP自适应播放延迟中的应用作为一名长期从事实时语音通信系统优化的工程师&#xff0c;我深知网络抖动对VoIP通话质量的致命影响。想象一下&#xff0c;当你正在与海外客户进行重要视频会议时&#xff0c;突然出现的语音卡顿和断断续续会多么令人抓狂。这正是我们…...

告别繁琐!在Mac/Linux上为RuoYi-Vue集成自动化部署脚本的完整流程

告别繁琐&#xff01;在Mac/Linux上为RuoYi-Vue集成自动化部署脚本的完整流程 在快速迭代的现代开发环境中&#xff0c;手动执行重复性部署操作已成为效率瓶颈。对于使用RuoYi-Vue框架的开发者而言&#xff0c;每次代码生成后需要完成文件移动、数据库更新、项目编译等一系列操…...

Hive数据导入的5种正确姿势:从本地文件到HDFS,手把手教你高效加载TB级数据

Hive数据导入的5种核心方法&#xff1a;从基础操作到TB级优化实战 当你面对一个装满数据的仓库&#xff0c;第一件事是什么&#xff1f;没错&#xff0c;就是把货物搬进去。在数据仓库的世界里&#xff0c;Hive就是这个仓库&#xff0c;而数据导入就是最关键的"搬货"…...