文章目录
- 一、效果展示
- 二、前提说明
- 三、Windows自带字体库实现方法
- 四、引入字体库实现方法
一、效果展示
水印123如下图
1.可以自定义(类型:汉字、数字都支持)
2.可以定位指定位置
二、前提说明
- 实现添加水印功能中Windows服务器和Linux服务器的区别是:
Windows自带字体库,而Linux不带
,如果是数字类型水印,区别不大,汉字的话,Windows正常显示,Linux显示口口口
这样的 - Windows的字体库资源不需要网上下载,找到
C:\Windows\Fonts
目录下,选择想用的字体资源即可,字体资源后缀是.ttc
文件,与Linux服务器通用 - 下面有两种实现方法:1自带字体库(Windows),2引入字体库,区别是
Font的生成方式不同
- 字体库的引入可以放到项目里面,也可以放到服务器指定文件夹
- 文件只能是图片才能加水印
- 颜色推荐使用
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());
}
}