Java 使用Graphics生成海报图片(附效果图)

生成流程

1、创建画布

2、开启画图

3、画布上加载背景图片

4、画布上指定坐标绘制二维码(关于二维码实现的参考文后的链接)

5、将最终的图存放在本地

6、将图片url返回给前端

主要代码:

@PostMapping(value = "/getPoster")
    public Result<?> getPoster(@RequestBody ProductDto productDto) {
        Result<Map<String,Object>> result = new Result<Map<String,Object>>();
        Map<String,Object> map = new HashMap<String,Object>();
        Product product = productService.getById(productDto.getProductId());
        if (StringUtils.isEmpty(product.getPosterImg()))
        {
            return Result.error("海报图片未定义");
        }

        try
        {
            BufferedImage img = new BufferedImage(750, 1334, BufferedImage.TYPE_INT_RGB);
            //开启画图
            Graphics g = img.getGraphics();
            //背景 -- 读取互联网图片
            BufferedImage back  = ImageIO.read(new File(uploadpath + "/" + product.getPosterImg()));
            g.drawImage(back.getScaledInstance(750, 1334, Image.SCALE_DEFAULT), 0, 0, null); // 绘制缩小后的图

            String fileName = productDto.getOpenid() + "@" + productDto.getProductId() + ".jpg";
            //生成二维码
            QRCodeUtil.encode(productDto.getProductUrl(), "", uploadpath + "/qrcode/", fileName, true);
            BufferedImage qrCode  = ImageIO.read(new File(uploadpath + "/qrcode/" + fileName));
            // 绘制缩小后的图
            g.drawImage(qrCode.getScaledInstance(174, 174, Image.SCALE_DEFAULT), 536, 1057, null);
            g.dispose();

            //先将画好的海报写到本地
            String picUrl = uploadpath + "/poster/"  + fileName; // TODO
            File file = new File(picUrl);
            ImageIO.write(img, "jpg",file);
            map.put("imageUrl", "/poster/"  + fileName);
            result.setSuccess(true);
            result.setResult(map);
        } catch (Exception e)
        {
            e.printStackTrace();
            return Result.error("生成海报出现错误!");
        }
        return result;
    }

背景图片(图片有点丑,相关字样及二维码进行了打码处理,不然可能过不了审)

生成后

相关文章

Java 使用zxing生成二维码   https://tangying.blog.csdn.net/article/details/134756196

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 系列 第五篇 C++ 算术运算符及类型转换

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 C 系列 第四篇 C 数据类型…

实验案例二:多表查询

1、表联接类型。 表联接类型可以分为内联接&#xff0e;外联接和交叉联接等。 1&#xff0e;内联接。 内联接〈 inner join&#xff09;是最常用的-一-种联接方式&#xff0c;只返回两个数据集合之间匹配关系的行&#xff0c;将位于两个互相交叉的数据集合中重叠部分以内的数…

Flink核心概念

并行度 当要处理的数据量非常大时&#xff0c;我们可以把一个算子操作&#xff0c;“复制”多份到多个节点&#xff0c;数据来了之后就可以到其中任意一个执行。这样一来&#xff0c;一个算子任务就被拆分成了多个并行的“子任务”&#xff08;subtasks&#xff09;&#xff0…

国标GB28181视频监控EasyCVR内网环境部署无法启动怎么办?

安防视频监控系统EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTMP、RTSP、HTTP-FLV、…

U-Shape Transformer for Underwater Image Enhancement(用于水下图像增强的U型Transformer)总结

背景 现有的水下数据集或多或少存在图像数量少、水下场景少、甚至不是真实场景等缺点&#xff0c;限制了数据驱动的水下图像增强方法的性能。此外&#xff0c;水下图像在不同颜色通道和空间区域的衰减不一致也没有统一的框架。 贡献 1&#xff09;提出了一种处理 UIE 任务的…

盘点2023年有哪些办公的效率工具

大家在使用Office时&#xff0c;会经常遇到一些比较繁杂的场景&#xff0c;比如设置段落格式&#xff0c;设置对齐方式&#xff0c;公式计算、文章排版等。使用工具能帮助我们轻松提高效率完成想要的效果&#xff0c;今天给大家介绍几款超实用的Office插件&#xff0c;不分分后…

uniapp 云打包 生成安卓证书文件

现在使用uniapp来开发小程序&#xff0c;H5&#xff0c;APP越来越多了&#xff0c;目前开发了一款APP&#xff0c;使用的也是uniapp。在此记录下用uniapp开发app云打包时约到的一些问题吧。 前因是我司安卓同学休产假&#xff0c;像云打包时需要的证书文件只能自己动手来搞。看…

国标GB28181安防监控平台EasyCVR录像时间轴优化步骤

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

SQL自学通之表达式条件语句与运算

目录 一、目标 二、表达式条件语句 1、表达式&#xff1a; 2、条件 2.1、WHERE 子句 三、运算 1、数值型运算: 1.1、加法() 1.2、减法 (-) 1.3、除法&#xff08;/&#xff09; 1.4、乘法 &#xff08;*&#xff09; 1.5、取模 &#xff08;%&#xff09; 优先级别…

第1章 理解知识图谱:知识图谱现状、知识图谱应用场景(二)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

GPT市场将取代插件商店 openAI已经关闭plugins申请,全部集成到GPTs(Actions)来连接现实世界,可以与物理世界互动了。

Actions使用了plugins的许多核心思想&#xff0c;也增加了新的特性。 ChatGPT的"Actions"与"Plugins"是OpenAI在GPT模型中引入的两种不同的功能扩展机制。这两种机制的目的是增强模型的功能&#xff0c;使其能够处理更多样化的任务和请求。下面是对两者的比…

在OSPF中使用基本ACL过滤路由信息示例

1、ACL的基本原理。 ACL由一系列规则组成&#xff0c;通过将报文与ACL规则进行匹配&#xff0c;设备可以过滤出特定的报文。设备支持软件ACL和硬件ACL两种实现方式。 2、ACL的组成。 ACL名称&#xff1a;通过名称来标识ACL&#xff0c;就像用域名代替IP地址一样&#xff0c;更…

LeetCode 每日一题 Day 3||深度优先搜索(DFS)

1038. 从二叉搜索树到更大和树 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅…

ffmpeg编译支持AVS3编解码

libuavs3d ffmpeg的官方源码中已经支持了libuavs3d解码器的接口&#xff08;libavcodec/libuavs3d.c中定义&#xff09;&#xff0c;因此如果需要编译ffmpeg支持libuavs3d解码器&#xff0c;只需要安装libuavs3d.so以及开启ffmpeg的编译选项即可。 安装libuavs3d解码器 #代码仓…

ssm党务政务服务热线平台源码和论文答辩PPT

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

生命周期模型构建方法与分析及实际案例应用

生命周期分析 (Life Cycle Analysis, LCA) 是评价一个产品系统生命周期整个阶段——从原材料的提取和加工&#xff0c;到产品生产、包装、市场营销、使用、再使用和产品维护&#xff0c;直至再循环和最终废物处置——的环境影响的工具。这种方法被认为是一种“从摇篮到坟墓”的…

MES管理系统与MOM系统分别有什么作用

随着科技的不断进步和全球化的竞争加剧&#xff0c;制造业正面临着前所未有的挑战和机遇。为了更好地适应市场需求&#xff0c;提高生产效率和质量&#xff0c;制造企业纷纷引进各种信息化管理系统。其中&#xff0c;MES管理系统和MOM系统是两种重要的解决方案。本文将详细探讨…

js中继承的方法

前言: 本人刚写了一篇原型链的封装继承多态,用家有儿女做的demo。其实我个人感觉封装和多态都容易去理解与实现。关键在于继承,js的才是比较难的,也容易让人混乱,至少我是因为继承头大过\(^o^)/~ js中有很多方法可以实现继承,这篇文章主要对继承的方法进行学习与测试。 这里…

c++ 三目运算符在类中的使用

简介 在类比较方面&#xff0c;三目运算符可以用于重载比较运算符。 代码示例1 #include <iostream> #include <cstring>class Person { public:Person(const char* name, int age) : m_age(age) {m_name new char[strlen(name) 1];strcpy(m_name, name);}~Pe…