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

一、效果展示

水印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());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XuDream

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值