Windows和Linux服务器给图片添加水印两种方法,引用字体库和自带字体库

news2024/12/27 16:32:51

文章目录

    • 一、效果展示
    • 二、前提说明
    • 三、Windows自带字体库实现方法
    • 四、引入字体库实现方法

一、效果展示

水印123如下图

1.可以自定义(类型:汉字、数字都支持)
2.可以定位指定位置
在这里插入图片描述

二、前提说明

  1. 实现添加水印功能中Windows服务器和Linux服务器的区别是:Windows自带字体库,而Linux不带,如果是数字类型水印,区别不大,汉字的话,Windows正常显示,Linux显示口口口这样的
  2. Windows的字体库资源不需要网上下载,找到C:\Windows\Fonts目录下,选择想用的字体资源即可,字体资源后缀是.ttc文件,与Linux服务器通用
  3. 下面有两种实现方法:1自带字体库(Windows),2引入字体库,区别是Font的生成方式不同
  4. 字体库的引入可以放到项目里面,也可以放到服务器指定文件夹
  5. 文件只能是图片才能加水印
  6. 颜色推荐使用Color.GRAY

三、Windows自带字体库实现方法

package com.joolun.cloud.common.core.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class WaterMarkUtils {

	/**
	 * 图片添加水印
	 *
	 * @param imgFile
	 *            需要添加水印的图片
	 * @param markContentColor
	 *            水印文字的颜色
	 * @param waterMarkContent
	 *            水印的文字
	 * @return  水印图片
	 */
	public static File markStr(File imgFile, Color markContentColor, String waterMarkContent) {
		try {
			// 加水印
			BufferedImage bufImg = ImageIO.read(imgFile);
			int width = bufImg.getWidth(); //图片宽
			int height = bufImg.getHeight(); //图片高
			Graphics2D g = bufImg.createGraphics();
			g.drawImage(bufImg, 0, 0, width, height, null);
			Font font = new Font("微软雅黑", Font.ITALIC, 45);
			g.setColor(markContentColor); // 根据图片的背景设置水印颜色
			g.setFont(font);
			int x = width -2*getWatermarkLength(waterMarkContent, g); //这是一个计算水印位置的函数,可以根据需求添加
			int y = height - 1*getWatermarkLength(waterMarkContent, g);
			System.out.println("水印位置x="+x);
			System.out.println("水印位置y="+y);
			g.drawString(waterMarkContent, x, y);
			g.dispose();

			ImageIO.write(bufImg, "png", imgFile);
			return imgFile;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取水印文字总长度
	 *
	 * @param waterMarkContent
	 *            水印的文字
	 * @param g
	 * @return 水印文字总长度
	 */
	public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
		return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
	}
}

四、引入字体库实现方法

package com.joolun.cloud.common.core.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import javax.imageio.ImageIO;

public class WaterMarkUtils {

	/**
	 * 图片添加水印
	 *
	 * @param imgFile
	 *            需要添加水印的图片
	 * @param markContentColor
	 *            水印文字的颜色
	 * @param waterMarkContent
	 *            水印的文字
	 * @return  水印图片
	 */
	public static File markStr(File imgFile, Color markContentColor, String waterMarkContent) {
		try {
			// 加水印
			BufferedImage bufImg = ImageIO.read(imgFile);
			int width = bufImg.getWidth(); //图片宽
			int height = bufImg.getHeight(); //图片高
			Graphics2D g = bufImg.createGraphics();
			g.drawImage(bufImg, 0, 0, width, height, null);
			try (
				//这个/fonts/simsun.ttc可以是在项目中,也可以是在服务器指定文件中
				InputStream fontFile = WaterMarkUtils.class.getResourceAsStream("/fonts/simsun.ttc")) {
				Font font = Font.createFont(Font.PLAIN, fontFile).deriveFont(Font.BOLD, 10f);
				g.setColor(markContentColor); // 根据图片的背景设置水印颜色
				g.setFont(font);
			}
			int x = width -2*getWatermarkLength(waterMarkContent, g); //这是一个计算水印位置的函数,可以根据需求添加
			int y = height - 1*getWatermarkLength(waterMarkContent, g);
			System.out.println("水印位置x="+x);
			System.out.println("水印位置y="+y);
			g.drawString(waterMarkContent, x, y);
			g.dispose();

			ImageIO.write(bufImg, "png", imgFile);
			return imgFile;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取水印文字总长度
	 *
	 * @param waterMarkContent
	 *            水印的文字
	 * @param g
	 * @return 水印文字总长度
	 */
	public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
		return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
	}
}

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

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

相关文章

系统日志管理

什么是系统日志 系统日志由 Linux/Unix 和其他网络设备(如交换机、路由器和防火墙)生成。系统日志包含有价值的信息,有助于保护网络和解决操作问题。因此,收集和分析系统日志至关重要。 系统日志包含什么 系统日志标准包含三个不…

Linux:MBR 扇区故障处理 (备份|恢复)

大概思路: 我们准备一个硬盘,并分出一个分区用于单独存放MBR备份文件 或者 和别的文件放在一起也可以(前提是不怕乱) 然后将分区挂载 然后进行MBR备份 把备份文件放到分区里 然后对MBR进行破坏(仅供实验参考&…

选择好的自动化测试工具影响会很大

根据当前项目和QA团队的人员能力,选择的自动化测试工具除具有使用的广泛性外,还必须考虑许多不同方面兼容性,例如项目迭代范围和需求变更。最佳工具并不能保证最佳的测试使用结果。 测试自动化的意义 随着自动化测试的普及,有关…

iPhone漏电10年大量用户受伤,官方回应:建议戴套

由于欧盟的强制要求,苹果用了多年的 Lightning 终于走到了尽头。 今年开始,包括 iPhone 15 全机型都将统一更换为 Type-C 接口。 对重视使用体验的用户来说,简直大快人心。 之前的 Lightning 不光蹭充电器相对麻烦,USB 2.0 的速…

可配置Modbus网关 嵌入式设备联网解决方案

1.概述 可配置Modbus网关可以预先配置Modbus RTU端的设备的地址、功能码和寄存器列表,并存储到网关内部。网关会自动采集这些配置的RTU设备的数据,然后映射到连续的Modbus TCP寄存器地址,从而允许Modbus TCP端一次性读取所有的设备的不同寄存…

基于AT89C51单片机的电子密码锁设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87848194?spm=1001.2014.3001.5503 源码获取 摘 要 随着经济社会发展,人们生活水平的提高,如何实现家庭防盗这一问题也变的尤其的突出。传统的机械锁,由于其构造简单,安…

手机卡停机三个月被自动注销,欠费需要补交吗?不交会影响征信?

经常换手机卡的朋友都会面临着这样的一个问题,手机卡欠费不用而且忘了注销,三个月过后自动注销了,这样就会面临着一个问题,欠费应该怎么处理,需要补交吗?如果不补交会影响个人征信吗? 官方解释是…

电商服务智能解决方案

互联网时代,智能客服已成为电商企业客户服务、管理和运营的标配。面临大量客户咨询、订单流程等业务,传统人工客服工作时间有限、人员流动性大、人工成本持续上涨等,已经无法满足电商企业“数智化”转型的需求,这也促使AI成为电商…

线程池及gdb调试多线程

一、线程池概念和使用 概念:通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合 必要性: 我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程…

Breakdance Builder评测 – 快速构建网站?

您是否正在寻找一个WordPress页面构建器,它可以轻松快速地构建网站 – 而不会使网站臃肿?如果是这样,您可能希望继续阅读这篇Breakdance Builder评测。 在构建网站时,速度就是一切。 编辑器在后端加载的速度有多快?您…

Vue + intro.js 实现页面新手引导流程功能

效果图: 1、安装 intro.js npm install intro.js --save 2、在项目的 main.js 中,引入 intro.js 库和相关样式文件,如下: // 首页引导插件 import intro from intro.js // introjs库 import intro.js/introjs.css // introjs默…

民宿小程序源码,开启民宿新模式

今天我为大家带来了一份最新的民宿小程序源码!这个源码不仅可以帮助你开启民宿新模式,还可以让你轻松实现线上预订、在线客服等多种功能。 民宿小程序源码,是什么? 民宿小程序源码是一款基于微信小程序平台的民宿管理系统&#…

数据库基础概念

文章目录 一、什么是数据库二、数据库的分类三、数据库的使用(内部) 一、什么是数据库 数据库是一类软件,作用是管理数据,内部应用了许多数据结构。但是我们还可以用文档储存数据,为什么要出现数据库? 文…

2022年天府杯全国大学生数学建模竞赛B题第一“君”情解题全过程文档及程序

2022年天府杯全国大学生数学建模竞赛 B题 第一“君”情 原题再现: 近日俄罗斯和乌克兰的冲突日益加剧,不难发现现代战争仍然是以人为主的战争,并未进入到全机械化的战争状态。那么在战争中军事物资的补给显得十分重要,中国古代兵…

Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

1. 图像运算概念2. 图像运算2.1 add()2.2 substract()部分代码示例: 2.3 multiply()/divide()2.4 addWeighted()部分代码展示 2.5 与/或/非bitwise_and()bitwise_or()bitwise_not()bitwise_xor部分代码展示 3.给一幅图像添加水印 1. 图像运算概念 在计算机的世界里…

git工作流实践

常见分支命名 远程仓库的分支:主干分支master, 开发分支dev,发布分支release 个人开发分支:特性分支feature, 缺陷修改分支bugfix, 热更新分支 hotfix 一般工作流如下 创建个人本地开发分支: git checkout -b feat…

Benewake(北醒) 快速实现TFmini-i-RS485与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接器2. TFmini-i-RS4853. 兆信直流电源4.连接线、绝缘胶带、螺丝刀5. PC:Windows 系统6. 串口助手软件 三、连接方式1. USB-RS485 转接板接口说明2. TFmini-i-RS485 引脚定义3. 连接图 四、TFmini-i-RS485 与电脑通信操作说…

cisp pte模拟题

1.信息搜集 本题共三个key 端口 1433 27689 存活ip 192.168.85.137 2.访问网站27689进行信息搜集 一个登录框,sql注入失败,暴力破解失败 扫描目录 发现三个文件robots.txt ,web.config 除了robots.txt,其他都访问不了 访问robots.txt,发现一个file参数…

ChatGPT实际上是如何工作的?

ChatGPT是如何工作的? 我们深入研究了广受欢迎的AI聊天机器人ChatGPT的内部运作方式。如果您想了解它是如何进行生成式人工智能魔术的,请继续阅读。 谷歌、Wolfram Alpha和ChatGPT都通过一个单行文本输入框与用户进行交互,并提供文本结果。谷…

Ubuntu18.04下搭建Ardupliot开发环境

本文参考的文章: -Ardupilot开发环境搭建(Ubuntu18.04,20190407) -Ardupilot环境搭建 1、下载文件 1.在GitHub上下载ardupilot文件,网速很慢的时候科学上网。 git clone https://github.com/ArduPilot/ardupilotcd ardupilotgit…