java小知识:图片添加中文水印,部署到linux环境乱码解决

源码如下:

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Objects;/*** 图片添加文字水印** @param sourceImagePath 原图路径* @param targetImagePath 加水印后图片的保存路径* @param watermarkText   水印文字*/
public static String addWatermark(String sourceImagePath, String targetImagePath, String watermarkText) {if (sourceImagePath == null || targetImagePath == null || watermarkText == null) {log.error("【FileUtils.addWatermark】参数不能为空");return sourceImagePath;}if (watermarkText.isEmpty() || watermarkText.length() > 50) {log.error("【FileUtils.addWatermark】水印文字不能为空且长度不能超过50个字符");return sourceImagePath;}File sourceFile = new File(sourceImagePath);File targetFile = new File(targetImagePath);if (!sourceFile.exists() || !sourceFile.isFile()) {log.error("【FileUtils.addWatermark】源文件不存在或路径错误");return sourceImagePath;}try {BufferedImage originalImage = ImageIO.read(sourceFile);BufferedImage watermarkedImage = ImageUtils.applyTextWatermark(originalImage, watermarkText);File parentDir = targetFile.getParentFile();if (!parentDir.exists()) {parentDir.mkdirs();}ImageIO.write(watermarkedImage, "png", targetFile);log.info("【FileUtils.addWatermark】添加水印成功,已保存至: " + targetImagePath);} catch (IOException | FontFormatException e) {log.error("【FileUtils.addWatermark】添加水印失败", e);}return targetImagePath;
}/*** 应用文字水印到图片上** @param image 原始图片* @param text  水印文字* @return 加了水印的图片* @throws IOException 图像处理异常*/
private static BufferedImage applyTextWatermark(BufferedImage image, String text) throws IOException, FontFormatException {// 创建图形上下文Graphics2D g2d = image.createGraphics();g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); // 透明度//读取宋体字体文件Font font = Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(ImageUtils.class.getResourceAsStream("/fonts/simsun.ttc")));// 设置水印文本的字体和颜色g2d.setFont(font.deriveFont(Font.PLAIN, 30)); // 设置中文字体,确保字体支持中文g2d.setColor(Color.BLACK);// 获取文本的宽度和高度,以便正确放置水印FontMetrics metrics = g2d.getFontMetrics();int textWidth = metrics.stringWidth(text);int textHeight = metrics.getHeight();// 获取图片的宽度和高度int imageWidth = image.getWidth();int imageHeight = image.getHeight();// 计算右下角的坐标int x = imageWidth - textWidth - 10; // 留一些边距int y = imageHeight - textHeight - 10; // 留一些边距// 将文本绘制到图片上String watermarkText = new String(text.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);g2d.drawString(watermarkText, x, y);// 释放图形上下文的资源g2d.dispose();return image;
}public static void main(String[] args) {addWatermark("C:\\Users\\JTDZ2PFE\\Desktop\\Son_Goku.png", "C:\\Users\\JTDZ2PFE\\Desktop\\Son_Goku1.png", "添加水印");
}

1.获取字体文件,Windows系统进入C:\WINDOWS\Fonts目录

在这里插入图片描述
2.选取自己需要的字体文件,拷贝到项目配置文件目录下
在这里插入图片描述
3.这样就避免了图片添加水印时,linux环境找不到字体而导致的乱码问题。

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

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

相关文章

批量生成大量附件(如:excel,txt,pdf)压缩包等文件时前端超时,采用mq+redis异步处理和多线程优化提升性能

一.首先分析一下场景:项目中我需要从财务模块去取单证模块的数据来生成一个个excel文件 在单证那个一个提单号就是一个excel文件,我们这边一个财务发票可能会查出几千个提单,也就是会生成几百个excel,然后压缩为一个压缩包&#x…

01.Net基础知识

.Net的用途 Web、移动、云、桌面、游戏开发、物联网 (IDE:集成开发环境) .Net学习资源 Microsoft Learn、GitHub、G码云(Gitee) Visual Studio初步使用 1)可创建的项目种类(主要学习以下四…

特征提取与深度神经网络DNN

OpenCV中的深度神经网络(DNN)模块,现在已经支持图像风格迁移、图像分类、对象检测、语义分割、实例分割、图像变换等。 只支持推理,不支持训练 支持主流的深度学习框架生成模型 推荐使用pytorch/onnx/tensorflow ResNet18的图像…

Java 常见集合类

集合的整体框架 Java 的集合,也可以叫做容器,根据集合的整体框架可以看出,主要是两大集合接口:第一个是 Collection 接口,主要用来存放单一的元素对象;另一个是 Map 接口,主要用于存储键值对。…

续篇——源码部署LAMP环境上线项目——禅道项目

上篇:LNMP环境部署WordPress——使用源码包安装方式部署环境-CSDN博客 目录 一.前提准备 1. 名词区别 2. 下载项目软件包 3. 上传项目源码到虚拟机并解压 二.安装Apache 1. 环境清理 2.关闭Nginx 3. 下载Apache 4. 下载APR组件 4.1 安装apr 4.2 安装apr-util组件 5…

白话机器学习4:小波分解的原理与Python代码实现

小波去噪可以想象成使用一把“筛子”来过滤信号。这个“筛子”能够根据信号的不同频率成分,将其分解成多个层次。在这个过程中,信号的重要信息通常包含在低频部分,而噪声则多分布在高频部分。 将信号通过这个“筛子”分解后,我们可…

Linux提权--本地环境变量文件配合 SUID

免责声明:本文仅做技术交流与学习... 目录 背景: 前提条件: 演示: 实战中如何操作? 探针发现: 背景: 环境变量提权--------> 背景: 管理员编译了程序,给予了程序管理员运行的方案, 攻击通过对程序的运行调试反编译等得到了程序的运行大概逻辑, …

05-Fortran基础--Fortran文件操作

05-Fortran基础--Fortran文件操作 0 引言1 文件操作有关的关键字介绍1.1 打开文件(OPEN)1.2 文件关闭(CLOSE)1.3 文件查询(INQUIRE)1.3 文件读写(read/write)1.4 文件操作符&#xf…

二叉树介绍

引入 定义 区别 定义不同 形态不同 基本形态

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处: 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

睿尔曼机械臂ROS控制

下载git工程 git clone https://github.com/RealManRobot/rm_robot.git安装配置 catkin build rm_msgs source devel/setup.bash catkin build source setup.bash这里注意,如果采用setup.sh多半不会成功,必须要source setup.bash文件,ros才…

vue2项目升级到vue3经历分享5

写到第5篇了,解决了很多问题,还有一些需要调整 1 el-input-number指令兼容性调整 下面这个可编辑的表格,全是0,于是需要一个指令,让它自己实现如果是0,就置空;如果是数字就是格式化为千分位&…