场景
java实现给图片添加水印实现步骤:
获取原图片对象信息(本地图片或网络图片)
添加水印(设置水印颜色、字体、坐标等)
处理输出目标图片。
注:
实现
1、新建工具类
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 添加水印util
*/
public class WatermarkUtils {
/**
* 读取本地图片
*
* @param path 本地图片存放路径
*/
public static Image readLocalPicture(String path) {
if (null == path) {
throw new RuntimeException("本地图片路径不能为空");
}
// 读取原图片信息 得到文件
File srcImgFile = new File(path);
try {
// 将文件对象转化为图片对象
return ImageIO.read(srcImgFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 读取网络图片
*
* @param path 网络图片地址
*/
public static Image readNetworkPicture(String path) {
if (null == path) {
throw new RuntimeException("网络图片路径不能为空");
}
try {
// 创建一个URL对象,获取网络图片的地址信息
URL url = new URL(path);
// 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
BufferedImage bugImg = ImageIO.read(url.openStream());
if (null == bugImg) {
throw new RuntimeException("网络图片地址不正确");
}
return bugImg;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 水印处理
*
* @param image 图片对象
* @param type 水印类型(1-文字水印 2-图片水印)
* @param watermark 水印内容(文字水印内容/图片水印的存放路径)
* @param tarImgPath 输出照片的存放路径
* @param x 水印坐标x
* @param y 水印坐标y
*/
public static String manageWatermark(Image image, Integer type, String watermark,int x ,int y,String tarImgPath) {
int imgWidth = image.getWidth(null);
int imgHeight = image.getHeight(null);
BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
// 加水印:
// 创建画笔
Graphics2D graphics = bufImg.createGraphics();
// 绘制原始图片
graphics.drawImage(image, 0, 0, imgWidth, imgHeight, null);
// 校验水印的类型
if (type == 1) {
if (StringUtils.isEmpty(watermark)) {
throw new RuntimeException("文字水印内容不能为空");
}
// 添加文字水印:
// 根据图片的背景设置水印颜色
graphics.setColor(new Color(255, 0, 0, 128));
// 设置字体 画笔字体样式为微软雅黑,加粗,文字大小为45pt
graphics.setFont(new Font("微软雅黑", Font.BOLD, 45));
// 画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
graphics.drawString(watermark, x, y);
graphics.dispose();
} else {
// 添加图片水印:
if (StringUtils.isEmpty(watermark)) {
throw new RuntimeException("图片水印存放路径不能为空");
}
Image srcWatermark = readLocalPicture(watermark);
//获取图片原始宽度
//int watermarkWidth = srcWatermark.getWidth(null);
int watermarkWidth = 50;
//获取图片原始高度
//int watermarkHeight = srcWatermark.getHeight(null);
int watermarkHeight = 50;
// 设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
// 绘制水印图片
graphics.drawImage(srcWatermark, x, y, watermarkWidth, watermarkHeight, null);
graphics.dispose();
}
// 输出图片
try {
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
ImageIO.write(bufImg, "png", outImgStream);
outImgStream.flush();
outImgStream.close();
return "水印添加成功";
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
2、编写测试
测试本地图片添加文字水印
Image image = readLocalPicture("D://test//test.png");
//添加文字水印
manageWatermark(image,1,"霸道的程序猿",150,50,"D://test//testResult"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".png");
其中水印位置的确定是根据像素坐标来的,可使用画图工具打开照片,确定像素坐标
右下角有输出的像素坐标。
添加文字水印效果
测试添加图片水印
Image image = readLocalPicture("D://test//test.png");
//添加图片水印
manageWatermark(image,2,"D://test//mark.jpg",150,50,"D://test//testResult"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))+".png");
测试效果