从代码中复制出来的,代码水印位置在左下角。
新手代码简陋,供查阅参考
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.16.0</version>
</dependency>
import lombok.Data;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
/**
* @author
* @date 2023/11/4 11:53
*/
@Data
public class WatermarkUtils {
//左侧以及运算基数
static int sizeFont = 30;
//行间距
static int lineSpacing = 10;
//第一行是否缩进
static boolean retract = false;
//缩进大小
static int ndentSize = 70;
public static FileInputStream watermark(MultipartFile multipartFile,String[] waterMarkContent) throws Exception{
Image srcImg = ImageIO.read(multipartFile.getInputStream());
//获取图片的宽
int srcImgWidth = srcImg.getWidth(null);
//获取图片的高
int srcImgHeight = srcImg.getHeight(null);
System.out.println("图片的宽:" + srcImgWidth);
System.out.println("图片的高:" + srcImgHeight);
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 加水印
//创建画笔
Graphics2D g = bufImg.createGraphics();
//srcImg 为上面获取到的原始图片的图片对象
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//-------------------------文字水印 start----------------------------
//文字内容
if (ObjectUtils.isEmpty(waterMarkContent)){
waterMarkContent = new String[]{"时间无", "· 围栏地址无"};
}
//文字大小
Integer[] sizes = {40, 30};
//水印文字行数
int rows = waterMarkContent.length;
for (int i = 0; i < rows; i++) {
//根据图片的背景设置水印颜色
g.setColor(new Color(254, 255, 251, 250));
//设置字体 画笔字体样式为微软雅黑,加粗,文字大小
g.setFont(new Font("宋体", Font.BOLD, sizes[i]));
//设置水印的坐标
int x = sizeFont;
if (0==i && retract){
x += ndentSize;
}
int y = srcImgHeight - (rows - i) * sizes[i] - (lineSpacing * (rows - i));
// System.out.println(i + " 坐标x:" + x + " 坐标y:" + y);
//画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
g.drawString(waterMarkContent[i], x, y);
}
//-------------------------文字水印 end----------------------------
//-------------------------图片水印 start--------------------------
// 水印文件
Image srcWaterMark = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("static/20231104100744.png"));
//获取水印图片的宽度
int widthWaterMark = srcWaterMark.getWidth(null);
//获取水印图片的高度
int heightWaterMark = srcWaterMark.getHeight(null);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
//绘制水印图片 坐标为中间位置
double divisor = (double)widthWaterMark / (double)srcImgWidth;
int y = srcImgHeight - (rows) * sizes[0] - (lineSpacing * (rows)) - sizes[0] - (int)(heightWaterMark*divisor);
int x = sizeFont;
// System.out.println(" 坐标x:" + x + " 坐标y:" + y);
g.drawImage(srcWaterMark, x, y, (int)(widthWaterMark*divisor), (int)(heightWaterMark*divisor), null);
//-------------------------图片水印 end--------------------------
// 水印文件结束
g.dispose();
//待存储的地址
String originalFilename = multipartFile.getOriginalFilename();
int i = originalFilename.lastIndexOf(".");
File tarImgPath = File.createTempFile(originalFilename.substring(0,i),originalFilename.substring(i));
// 输出图片
FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
//jpg 图片小,其他格式图片大
ImageIO.write(bufImg, "jpg", outImgStream);
// System.out.println("添加水印完成");
outImgStream.flush();
outImgStream.close();
try {
return new FileInputStream(tarImgPath);
} catch (Exception e) {
throw new IOException("Failed to convert FileOutputStream to MultipartFile", e);
} finally {
// 删除临时文件
if (!tarImgPath.delete()) {
System.err.println("Failed to delete temporary file: " + tarImgPath.getAbsolutePath());
}
}
}
}