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环境找不到字体而导致的乱码问题。

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

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

相关文章

Rust学习笔记(上)

前言 笔记的内容主要参考与《Rust 程序设计语言》,一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下,其它两个地址在Rust学习笔记(中)和Rust学习笔记(下)。 编译与运行 Ru…

璩静也是受害者

5月7日,“百度副总裁璩静称员工闹分手提离职秒批”话题登上了热搜。在短视频里,璩静是会连续出差50天的“公关人”,没有春节周末、没有假期,她会说“员工闹分手提离职我秒批,为什么要考虑员工的家庭”。有网友对其视频…

知识库优劣详解:牵牛易帮 VS HelpLook AI知识库

知识库不仅可以帮助企业有效管理知识,还能提高员工工作效率和质量,因此越来越多的企业选择搭建知识库。在众多搭建知识库的工具中,有的企业会选择免费的牵牛易帮,有的则会更加倾向于付费的HelpLook AI知识库。其中的原因有很多。今…

力扣数据库题库学习(5.11日)--176. 第二高的薪水

176. 第二高的薪水 问题链接 分析 题目要求: 查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。 下面是示例: 查询结果如下例所示。 示例 1:输入: Employee 表: --…

Java——类与对象

目录 一、面向对象的初步认识 1.1 什么是面向对象 1.2 面向对象与面向过程 二、类的定义与使用 2.1 简单认识类 2.2 类的定义格式 三、类的实例化 3.1 什么是实例化 3.2 类和对象的说明 四、this引用 4.1 为什么要有this引用 4.2 什么是this引用 ​编辑 4.3 this引用…

verilog中输入序列连续的序列检测

编写一个序列检测模块,检测输入信号a是否满足01110001序列,当信号满足该序列,给出指示信号match。 模块的接口信号图如下: 代码如下: (CSDN代码块不支持Verilog,代码复制到notepad编辑器中&am…

pytest + yaml 框架 - 录制接口转 yaml 用例实现

pytest yaml 框架基本不用写 python 代码,只需写yaml 文件用例就能实现接口自动化。 现在引入接口录制功能,连 yaml 文件也不用写了,点点点就能生成 yaml 用例文件了。 录制功能在v1.3.4版本上实现 pip instal pytest-yaml-yoyo 环境准备 …

基于RFID的博物馆藏品管理系统

传统的博物馆藏品管理主要依赖人工记录和物理检查,这样的管理方式耗时耗力,并且容易出现记录错误。另外,对于藏品的定位和监控也存在一定的局限性。 RFID是一种无线通信技术,通过无线电频率识别标签上存储的信息,实现物…

代码随想录第五十天|最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

题目链接:. - 力扣(LeetCode) 最佳买卖股票时机含冷冻期与打家劫舍的题目有异曲同工之妙,主要是出现了天数的间隔,一次需要在买卖股票的最佳时机II 题目上做一点调整,代码如下: 如代码所示&…

24数维杯ABC题思路已更新!!!!

24数维杯A题保姆级思路+配套代码+后续参考论文 简单麦麦https://www.jdmm.cc/file/2710639/ 24数维杯B题保姆级思路+可执行代码+后续参考论文 简单麦麦https://www.jdmm.cc/file/2710640/ 24数维杯C题保姆级思路+可执…

在wine里启动Arctium Game Launcher.exe

尝试在wine里启动Arctium Game Launcher.exe 第一次直接启动wine Arctium Game Launcher.exe,结果报错,因为字符的因素,看不出是为啥报错。不过一般是c库有些问题。 为了安装c库,尝试了下载Visual c 安装,失败。尝试…

Windows 11 Manager (Win11系统优化大师) 中文破姐版 v1.4.3

01 软件介绍 ​Windows 11 Manager v1.4.3是一款综合性的系统优化工具,专为Win11设计。该工具包含超过40种功能,旨在全方位提升操作系统的性能。通过这些工具,用户可以对Windows 11进行深度优化和微调,清除不必要的文件&#xff…

FileLink跨网文件传输医疗行业解决方案

随着医疗行业的快速发展,医疗机构之间的信息共享和文件传输需求日益增加。然而,由于网络环境的复杂性和数据安全性的要求,传统的文件传输方式已经无法满足医疗行业的需求。为此,我们推出了FileLink跨网文件传输医疗行业解决方案&a…

矿用泄爆装置之——水封式防爆器使用说明

矿用泄爆装置之——水封式防爆器使用说明。 在这个快节奏的时代,您需要一款能够与您一同成长,满足您需求的产品。我们为您带来的不仅仅是一件产品,更是一份属于您不一样的新体验。【1-5-9】 一、水封式防爆器产品使用介绍 安装在抽放瓦斯泵进…

interview_bak

flink内存管理 JVM 存在的几个问题: Java 对象存储密度低。一个只包含 boolean 属性的对象占用了16个字节内存:对象头占了8个,boolean 属性占了1个,对齐填充占了7个。而实际上只需要一个bit(1/8字节)就够了。Full GC 会极大地影响性能,尤其是为了处理更大数据而开了很大…

QT---day5,通信

1、思维导图 2、TCp 服务器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

【C#】 SortedDictionary,查找字典中是否存在给定的关键字

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景场景说明红黑树原理判断代码Dictionary知识点相关文章 背景 最近…

创新案例|搜索新王Perplexity如何构建生成式AI产品开发的新模式

Perplexity AI&#xff1a;生成式搜索的颠覆者 刚刚成立满两年&#xff0c;Perplexity AI已经变成了我日常频繁使用的工具&#xff0c;甚至取代了我对 Google搜索的依赖 —— 而我并非个案。该公司仅凭不到 50 名员工&#xff0c;已经吸引了数千万用户。他们目前的年收入超过 …

Linux中的httpd服务简单应用,配置网页版显示

1.启动服务 2.开放端口或者关闭防火墙 3.删除欢迎网页 4.创建自己的目录和文件 5.登录查看

[已解决]ModuleNotFoundError: No module named ‘tqdm‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…