/**
* 添加水印
*/
public static void addTextWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String textWatermark,
Integer watermarkLocation,Color color,Font font,Integer horizontalRelativeOffset,Integer verticalRelativeOffset){
//-------------------------文字水印 start----------------------------
//根据图片的背景设置水印颜色
graphics2D.setColor(color);
//设置字体 画笔字体样式为微软雅黑,加粗,文字大小为60pt
graphics2D.setFont(font);
//设置水印的坐标(为原图片中间位置)
//textWatermark为水印内容
if (watermarkLocation == null){
watermarkLocation = WatermarkLocationEnum.CENTRE.getWatermarkLocation();
}
Map<String,Integer> location = getWatermarkLocation(watermarkLocation,srcImgWidth,srcImgHeight,textWatermark,graphics2D);
if (horizontalRelativeOffset == null){
horizontalRelativeOffset = 0;
}
if (verticalRelativeOffset == null){
verticalRelativeOffset = 0;
}
int x = location.get("x")+horizontalRelativeOffset;
int y = location.get("y")+verticalRelativeOffset;
//画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
graphics2D.drawString(textWatermark, x, y);
//-------------------------文字水印 end----------------------------
}
/**
* 获取水印位置
* @return
*/
public static Map<String,Integer> getWatermarkLocation(Integer watermarkLocation,int srcImgWidth,int srcImgHeight,String textWatermark,Graphics2D graphics2D){
Map<String,Integer> map = new HashMap<>();
if (WatermarkLocationEnum.TOP_LEFT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
int y=getWatermarkHeight(graphics2D);
map.put("x",0);
map.put("y",y);
}else if (WatermarkLocationEnum.ABOVE_CENTRE.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
int y=getWatermarkHeight(graphics2D);
map.put("x",x);
map.put("y",y);
}else if (WatermarkLocationEnum.UPPER_RIGHT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
int y=getWatermarkHeight(graphics2D);
map.put("x",x);
map.put("y",y);
}else if (WatermarkLocationEnum.CENTER_LEFT.getWatermarkLocation().equals(watermarkLocation)){
int y=srcImgHeight / 2;
map.put("x",0);
map.put("y",y);
}else if (WatermarkLocationEnum.CENTRE.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
int y=srcImgHeight / 2;
map.put("x",x);
map.put("y",y);
}else if (WatermarkLocationEnum.CENTER_RIGHT.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
int y=srcImgHeight / 2;
map.put("x",x);
map.put("y",y);
}else if (WatermarkLocationEnum.LOWER_LEFT_QUARTER.getWatermarkLocation().equals(watermarkLocation)){
int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
map.put("x",0);
map.put("y",y);
}else if (WatermarkLocationEnum.LOWER_CENTER.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D)) / 2;
int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
map.put("x",x);
map.put("y",y);
}else if (WatermarkLocationEnum.LOWER_RIGHT_CORNER.getWatermarkLocation().equals(watermarkLocation)){
int x=(srcImgWidth - getWatermarkLength(textWatermark, graphics2D));
int y=srcImgHeight - getWatermarkHeight(graphics2D)/2;
map.put("x",x);
map.put("y",y);
}
return map;
}
public static void main(String[] args) {
// 读取原图片信息 得到文件
File srcImgFile = new File("C:\\Users\\zmd\\Pictures\\微信图片_20230322145124.jpg");
//将文件对象转化为图片对象
Image srcImg = null;
try {
srcImg = ImageIO.read(srcImgFile);
} catch (IOException e) {
e.printStackTrace();
}
//获取图片的宽
int srcImgWidth = srcImg.getWidth(null);
//获取图片的高
int srcImgHeight = srcImg.getHeight(null);
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 加水印
//创建画笔
Graphics2D graphics2D = bufImg.createGraphics();
//绘制原始图片
graphics2D.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
Color color = new Color(25, 227, 160);
Font font = new Font("楷体", Font.ITALIC, 20);
//水平相对偏移
Integer horizontalRelativeOffset = 100;
//垂直相对偏移
Integer verticalRelativeOffset = 400;
addTextWatermark(graphics2D,srcImgWidth,srcImgHeight,"hello world",
WatermarkLocationEnum.CENTRE.getWatermarkLocation(),color,font,horizontalRelativeOffset,verticalRelativeOffset);
ByteArrayOutputStream os = null;
MultipartFile multipartFile = null;
try {
// outImgStream = new FileOutputStream(tarImgPath);
// ImageIO.write(bufImg, "png", outImgStream);
//创建一个ByteArrayOutputStream
os = new ByteArrayOutputStream();
//把BufferedImage写入ByteArrayOutputStream
//此处要写PNG否则可能会出现遮罩层
ImageIO.write(bufImg, "jpg", os);
//ByteArrayOutputStream转成InputStream
InputStream input = new ByteArrayInputStream(os.toByteArray());
multipartFile =new MockMultipartFile("file", "file.png", "text/plain", input);
multipartFile.transferTo(new File("d:/o.jpg"));
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != os) {
os.close();
}
// if (null != outImgStream) {
// outImgStream.flush();
// outImgStream.close();
// }
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 获取水印文字的长度
* @param waterMarkContent
* @param graphics2D
* @return
*/
public static int getWatermarkLength(String waterMarkContent, Graphics2D graphics2D) {
return graphics2D.getFontMetrics(graphics2D.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
/**
* 获取水印文字的高度
* @param graphics2D
* @return
*/
public static int getWatermarkHeight(Graphics2D graphics2D) {
return graphics2D.getFontMetrics(graphics2D.getFont()).getHeight();
}
public static void addImageWatermark(Graphics2D graphics2D,int srcImgWidth,int srcImgHeight,String imageWatermark,int type){
//-------------------------图片水印 start----------------------------
//水印文件
//创建一个URL对象,获取网络图片的地址信息(网络图片)
URL url = null;
//将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
Image srcWaterMark = null;
try {
url = new URL(imageWatermark);
srcWaterMark = ImageIO.read(url.openStream());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
//x,y为章需要合成到A图片上的位置坐标,w,h为将章缩小到多少长宽比例
//注意这行代码:graphics2D.drawlmage(img, x, y, w, h, null);
//绘制水印图片 坐标为自己选择
int x = 0;
int y = 0;
int width = (int)(srcImgWidth*0.1);
int height = (int)(srcImgWidth*0.1);
if (type == 1) {
//覆盖图片位于左上角
x = 0;
y = 0;
} else if (type == 2) {
//覆盖图片位于右上角
x = srcImgWidth - width;
y = 0;
} else if (type == 3) {
//覆盖图片位于左下角
x = 0;
y = srcImgHeight - height;
} else if (type == 4) {
//覆盖图片位于右下角
x = srcImgWidth - width;
y = srcImgHeight - height;
} else if (type == 5 ){
//覆盖图片位于中间
x = (srcImgWidth - width) / 2;
y = (srcImgWidth - height) / 2;
}
graphics2D.drawImage(srcWaterMark, x, y ,width, height, null);
// 水印文件结束
graphics2D.dispose();
//-------------------------图片水印 end----------------------------
}