场景
java实现给图片添加水印实现步骤:
获取原图片对象信息(本地图片或网络图片)
添加水印(设置水印颜色、字体、坐标等)
处理输出目标图片。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
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");
测试效果
标签:Graphics2D,Java,java,image,水印,import,new,图片 From: https://www.cnblogs.com/badaoliumangqizhi/p/18036947