java Graphics 图片叠放在另一张图片上,生成文字图片(可设置多图一起放到底图上)

news2024/9/26 1:18:44

 直接上代码:

public static void createGTImage(GtInfo resultObj) {
        String backPath = resultObj.getBackPath();
        String enterpriseName = resultObj.getEnterpriseName();
        String gtResultPath = resultObj.getGtResultPath();
        int gtResultPathX = resultObj.getGtResultPathX();
        String bingPic = resultObj.getBingPic();
        String iName = resultObj.getIName();
        String tanXiaoValue = resultObj.getTanXiaoValue();
        String levelPath = resultObj.getLevelPath();
        int levelPathY = resultObj.getLevelPathY();
        String totalTan = resultObj.getTotalTan();
        String totalTanPercent = resultObj.getTotalTanPercent();
        String resultPath = resultObj.getResultPath();

        try {
            // 目标文件
            File _file = new File(backPath);
            // 目标图片对象
            Image src = ImageIO.read(_file);
            // 目标图片宽度
            int wideth = src.getWidth(null);
            // 目标图片高度
            int height = src.getHeight(null);
            // 实例化缓存图片对象
            BufferedImage image = new BufferedImage(wideth, height,
                    BufferedImage.TYPE_INT_RGB);
            // 缓存图片对象画笔
            Graphics g = image.createGraphics();
            // 在缓存图片上先画目标图片
            g.drawImage(src, 0, 0, wideth, height, null);

            g.setColor(Color.white);
            Font font = new Font(FONTNAME, Font.PLAIN, 100); // 添加字体的属性设置
            g.setFont(font);

            //文字水平居中显示 2520图片最大宽度
            FontMetrics fm = g.getFontMetrics(font);
            int markWidth = fm.stringWidth(enterpriseName);
            int widthX = (2520 - markWidth) / 2;
            //将水印绘入图片
            g.drawString(enterpriseName,widthX,750);

            if(!StringUtils.isEmpty(levelPath)){
                // 水印文件
                File _filebiao = new File(levelPath);
                // 水印图片对象
                Image src_biao = ImageIO.read(_filebiao);
                // 水印图片宽度
                int wideth_biao = src_biao.getWidth(null);
                // 水印图片高度
                int height_biao = src_biao.getHeight(null);
                // 在缓存图片上再画水印图片
                g.drawImage(src_biao, 800,levelPathY , wideth_biao, height_biao, null);
            }

            if(!StringUtils.isEmpty(gtResultPath)){
                // 水印文件
                File _filebiao = new File(gtResultPath);
                // 水印图片对象
                Image src_biao = ImageIO.read(_filebiao);
                // 水印图片宽度
                int wideth_biao = src_biao.getWidth(null);
                // 水印图片高度
                int height_biao = src_biao.getHeight(null);
                // 在缓存图片上再画水印图片
                g.drawImage(src_biao, gtResultPathX,2200 , wideth_biao, height_biao, null);
            }
            if(!StringUtils.isEmpty(bingPic)){
                // 水印文件
                File _filebiao = new File(bingPic);
                // 水印图片对象
                Image src_biao = ImageIO.read(_filebiao);
                // 水印图片宽度
                int wideth_biao = src_biao.getWidth(null);
                // 水印图片高度
                int height_biao = src_biao.getHeight(null);
                // 在缓存图片上再画水印图片
                g.drawImage(src_biao, 1400,1020 , wideth_biao, height_biao, null);
            }

//            Font font=new Font("微软雅黑", Font.PLAIN, 80);
//            g.setFont(font);
            if(!StringUtils.isEmpty(iName)){
                g.drawString(iName,800,2720);
            }
            if(!StringUtils.isEmpty(totalTan)){
                g.drawString(totalTan,1750,2920);
            }
            if(!StringUtils.isEmpty(tanXiaoValue)){
                g.drawString(tanXiaoValue,1750,3093);
            }
            if(!StringUtils.isEmpty(totalTanPercent)){
                g.drawString(totalTanPercent,1750,3265);
            }

            // 结束
            g.dispose();
            ImageIO.write(image, "png", new File(resultPath));
        } catch (Exception e) {
            log.info("生成高碳报告异常:"+e);
        }
    }

GtInfo 类:

import lombok.Data;

@Data
public class GtInfo {

    private String enterpriseName;
    private String levelPath ;
    private int levelPathY ;
    private String gtResultPath ;
    private int gtResultPathX ;
    private String tanXiaoValue ;
    private String bingPic ;
    private String iName ;
    private String totalTan ;
    private String totalTanPercent ;
    private String backPath ;
    private String resultPath ;
}

生成文字图片,图片背景透明

 public static  String makewatermark(String mark,String resultPicPath){
        Font font=new Font("微软雅黑", Font.PLAIN, 110);
        Integer width=2250;
        Integer height=125;
        // 创建图片
        BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);

        Graphics2D g2d = image.createGraphics();
        //设置图片透明
        image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
        g2d = image.createGraphics();

        g2d.setColor(Color.white);
        //设置倾斜角度
//        g2d.rotate(Math.toRadians(-35), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
        g2d.setFont(font);
        // 消除java.awt.Font字体的锯齿
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // 0.3f是透明系数 ,透明系数取值范围是 0 ~ 1.0
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));

        FontMetrics fm = g2d.getFontMetrics(font);
        int markWidth = fm.stringWidth(mark);
        int widthX = (width - markWidth) / 2;
        //将水印绘入图片
        g2d.drawString(mark,widthX,105);
        g2d.dispose();

        //返回图片的base64码
        String base64 = null;
        try {
//            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            ImageIO.write(image, "png", new File(resultPicPath));
//            ImageIO.write(image, "png", stream);
//            base64 = Base64.encode(stream.toByteArray());
//            stream.flush();
//            stream.close();
        }catch (IOException e){
            e.printStackTrace();
        }
        return base64;
    }

原图:

 叠加+文字处理后:

 

 

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

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

相关文章

具身智能:人工智能的下一个浪潮

原创 | 文 BFT机器人 特斯拉 2023 年股东会上,马斯克强调了人形机器人对特斯拉未来的重要性,并预测其将成为公司的主要长期价值来源。他进一步表示:“如果人形机器人和人的比例大致为2比1,那么人们对机器人的需求可能达到100亿乃…

用二进制来输出一个数

用二进制来输出一个数 1&#xff0c;一个数 #include <stdio.h> #include <stdlib.h> #include <stdint.h>int main() {uint32_t m 0x00C00000;printf("m%o,m%d,m0x%x\n",m,m,m);binary(m);return 0; }2&#xff0c;方法 void binary(uint32_t…

Springboot 实践(7)springboot添加html页面,实现数据库数据的访问

前文讲解&#xff0c;项目已经实现了数据库Dao数据接口&#xff0c;并通过spring security数据实现了对系统资源的保护。本文重点讲解Dao数据接口页面的实现&#xff0c;其中涉及页面导航栏、菜单栏及页面信息栏3各部分。 1、创建html页面 前文讲解中&#xff0c;资源目录已经…

应届生如何快速通过软件测试面试?

应届生&#xff0c;没有实际项目经验怎么破&#xff1f; 面试的过程并不为为了显示面试官技术有多牛&#xff0c;也不是为了体现他们公司有多么难进而是考察你的能力和招聘需求是否相匹配&#xff0c;进而评估你能否满足工作需求&#xff0c;甚至实现更多的岗位期待。 弄清楚…

【【典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一】】

典型电路设计之片内存储器的设计之RAM的Verilog HDL描述一 RAM是随机存储器&#xff0c;存储单元的内容可按需随意取出或存入。这种存储器在断电后将丢失所有数据&#xff0c;一般用来存储一些短时间内使用的程序和数据。 其内部结构如下图所示&#xff1a; 例&#xff1a;用…

C语言如何实现DES加密与解密

C语言实现DES加密解密 #include "des.h" //移位表 static Table_size const shiftTable[NumberOfKeys] {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; //E扩展表 static Table_size const eTable[des_key_pc2_standard]{32, 1, 2, 3, 4, 5, 4, 5, 6, …

学校提升教学质量,这个方法很炸裂!

当今教育领域日益强调教学质量的提升和教师专业发展。为了实现这一目标&#xff0c;许多学校开始采用在线巡课系统来监控、评估和改进教学过程。 在线巡课系统作为一种创新的教学管理工具&#xff0c;不仅有助于教育管理者更好地了解教师的教学实践&#xff0c;还能够为教师提供…

如何发布自己的小程序

小程序的基础内容组件 text&#xff1a; 文本支持长按选中的效果 <text selectable>151535313511</text> rich-text: 把HTML字符串渲染为对应的UI <rich-text nodes"<h1 stylecolor:red;>123</h1>"></rich-text> 小程序的…

国标GB28181视频平台EasyGBS国标平台针对数据库删除级联数据后的无效数据进行优化的具体操作步骤

EasyGBS国标视频云服务可支持通过国标GB28181协议将设备接入&#xff0c;实现视频的实时监控直播、录像、语音对讲、云存储、告警、级联等功能&#xff0c;同时也支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。同…

spring核心技术(下)--面向切面aop的特点加案例论证

目录 一.spring的aop的特点 1.1 aop的简介 1.2 举例 二.spring的aop的专业术语 三.论证模拟 3.1.前置通知 3.2.后置通知 3.3.环绕通知 3.4.异常通知 3.5.过滤通知 今天就分享到这啦&#xff01;&#xff01; 一.spring的aop的特点 Spring就是一个轻量级的控制反转(IOC)和面向…

go es实例

go es实例 1、下载第三方库 go get github.com/olivere/elastic下载过程中出现如下报错&#xff1a; 解决方案&#xff1a; 2、示例 import package mainimport ("context""encoding/json""fmt""reflect""time""…

电脑文件删除了可以找回吗?3种文件恢复办法!

在日常工作中&#xff0c;我们经常会需要处理很多的工作文件&#xff0c;但有时候会不小心误删电脑中的文件。 那么&#xff0c;电脑上面的文件被删除了可以找回吗&#xff1f;答案是肯定的&#xff01;下面就来分享三种比较好用的方法&#xff0c;一起来看下吧。 方法一&…

C++初阶——构造函数的初始化列表

前言&#xff1a;C中&#xff0c;初始化列表是构造函数中极为重要的一部分,是每个成员变量定义的地方。 目录 一.什么是初始化列表二.何时用初始化列表声明处赋值——缺省值 三.注意点 一.什么是初始化列表 初始化列表是每个成员变量定义的地方。不管我们有没有写&#xff0c;成…

带你了解—使用内网穿透,公网远程访问本地硬盘文件

文章目录 前言1. 下载cpolar和Everything软件3. 设定http服务器端口4. 进入cpolar的设置5. 生成公网连到本地内网穿透数据隧道 总结 前言 随着云概念的流行&#xff0c;不少企业采用云存储技术来保存办公文件&#xff0c;同时&#xff0c;很多个人用户也感受到云存储带来的便利…

测试右移,也就是生产环境下的QA

一、一个生产环境 Bug 的解决办法 先来跟大家分享一个生产环境下的 Bug&#xff1a; 一个在线订购葡萄酒的系统&#xff0c;订购流程相对复杂&#xff0c;下单过程中后台会有随机的失败&#xff0c;系统采取的措施是重试&#xff0c;就是说顾客下单后&#xff0c;后台如果有错…

中期国际:MT4数据挖掘与分析方法:以数据为导向,制定有效的交易策略

在金融市场中&#xff0c;制定有效的交易策略是成功交易的关键。而要制定一份可靠的交易策略&#xff0c;数据挖掘与分析方法是不可或缺的工具。本文将介绍如何以数据为导向&#xff0c;利用MT4进行数据挖掘与分析&#xff0c;从而制定有效的交易策略。 首先&#xff0c;我们需…

易服客工作室:Uncode主题 - 创意和WooCommerce WordPress主题

Uncode主题是一款像素完美的创意 WordPress 主题&#xff0c;适用于任何类型的网站&#xff08;作品集、代理机构、自由职业者、博客&#xff09;&#xff0c;也是适用于商店&#xff08;电子商务、在线商店、企业&#xff09;的顶级 WooCommerce 主题。Uncode 的设计非常注重细…

C linux struct sigaction

在linux中定义struct sigaction结构体时, 在已经包含signal.h头文件的情况下, 仍旧提示找不到这个结构体. 需要在代码中定义 _POSIX_C_SOURCE 宏&#xff0c;并将其设为大于等于 199309L 的值。这样可以确保相关的函数和结构体在编译时可用。 这将告诉编译器以符合 POSIX 标准要…

vue项目打包成exe

目标&#xff1a;vue的项目打包成为exe可执行文件 工具&#xff1a;需要使用到Electron框架 首先&#xff0c;我们了解一下什么是Electron&#xff1b; Electron 是由 GitHub 开发而成的。它是使用 JavaScript&#xff0c;HTML 和 CSS 构建跨平台的桌面应用程序的框架&#…

[JavaWeb]【三】Maven

目录 一 什么是Maven 二 Maven的作用 2.1 依赖管理 2.2 统一项目目录 2.3 标准项目构建 三 Maven概述 3.1 介绍 3.2 安装 四 IDEA集成Maven 4.1 配置Maven环境 4.1.1 单个项目配置 4.1.1.1 创建项目 4.1.1.2 配置项目JDK版本 4.1.1.3 配置maven 4.1.2 配置全局Maven环…