给文件添加水印并上传
public R<BladeFile> upload(@RequestParam MultipartFile file, @RequestParam String bucketName) {
String waterMarkContent = "水印文字";
String[] waterMarkContents = waterMarkContent.split("\\|\\|");
String fileName = file.getOriginalFilename();//获取文件名称
File destFile = new File("D:/upload/" + fileName);//将文件放入文件夹
if (!destFile.getParentFile().exists()) {//判断路径是否存在
destFile.getParentFile().mkdirs();//如果没有则创建
}
try {
file.transferTo(destFile);
} catch (IOException e) {
e.printStackTrace();
}
File originalFile = new File("D:/upload/" + fileName);
BufferedImage image = ImgUtil.read(originalFile);
// 创建一个新的图片,用于保存加了水印的图片
BufferedImage watermarkImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
// 在新图片上绘制原图片
Graphics2D g2d = (Graphics2D) watermarkImage.getGraphics();
g2d.drawImage(image, 0, 0, null);
// 设置水印的文字内容和样式
Font font = new Font("宋体", Font.BOLD, 280);
g2d.setFont(font);
g2d.setColor(Color.GRAY);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.5f));
int srcImgWidth = image.getWidth(null);
//以图片宽度为度量,设置对应的字体大小
int fontSize;
if (srcImgWidth <= 3000) fontSize = 280;
else fontSize = (int) (srcImgWidth * 0.01);
// 原图高度
int srcImgHeight = image.getHeight(null);
// 设置水印文字字体
// 设置水印旋转
g2d.rotate(Math.toRadians(-45), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
// 获取其中最长的文字水印的大小
int maxLen = 0;
int maxHigh = 0;
for (int i = 0; i < waterMarkContents.length; i++) {
waterMarkContent = waterMarkContents[i];
int fontlen = getWatermarkLength(waterMarkContent, g2d);
if (fontlen >= maxLen) {
maxLen = fontlen;
}
maxHigh = maxHigh + (i + 1) * fontSize + 10;
break;
}
// 文字长度相对于图片宽度应该有多少行
int line = srcImgWidth * 2 / maxLen;
int co = srcImgHeight * 2 / maxHigh;
int yz = 0;
// 填充Y轴方向
for (int a = 0; a < co; a++) {
int t = 0;
for (int j = 0; j < waterMarkContents.length; j++) {
waterMarkContent = waterMarkContents[j];
int y = (j + 1) * fontSize + 10 + t;
// 文字叠加,自动换行叠加,注意符号
int tempX = -srcImgWidth / 2;
int tempY = -srcImgHeight / 2 + y + yz;
// 单字符长度
int tempCharLen = 0;
// 单行字符总长度临时计算
int tempLineLen = 0;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < waterMarkContent.length(); i++) {
char tempChar = waterMarkContent.charAt(i);
tempCharLen = getCharLen(tempChar, g2d);
tempLineLen += tempCharLen;
// 和图片的长度进行对应的比较操作
if (tempLineLen >= srcImgWidth) {
// 长度已经满一行,进行文字叠加
g2d.drawString(sb.toString(), tempX, tempY);
t = t + fontSize;
// 清空内容,重新追加
sb.delete(0, sb.length());
tempY += fontSize;
tempLineLen = 0;
}
// 追加字符
sb.append(tempChar);
}
// 填充X轴
for (int z = 0; z < line; z++) {
// 最后叠加余下的文字
g2d.drawString(sb.toString(), tempX, tempY);
tempX = tempX + maxLen + XMOVE;
}
}
yz = yz + maxHigh + YMOVE;
}
// 在新图片上绘制水印
g2d.drawString("Watermark Text", 100, 100);
// 保存加了水印的图片
File watermarkFile = new File("D:/upload/" + fileName);
ImageIO.write(watermarkImage, "jpg", watermarkFile);
System.out.println("成功给图片加上水印!");
BladeFile newfile = minioTemplate.putFile(bucketName, getMultipartFile(watermarkFile));//上传文件
return R.data(newfile);
}
工具类和参数
public class WaterMarkUtils {
private static final int XMOVE = 80;//满屏水印中水印之间的横向间隔
private static final int YMOVE = 80;//满屏水印中水印之间的纵向间隔
private static Color color = Color.red;//水印文字颜色
private static int positionWidth = 150;//单个水印中水印横向位置
private static int positionHeight = 300;//单个水印中水印纵向位置
public int getCharLen(char c, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charWidth(c);
}
/**
* 获取水印文字总长度
*
* @paramwaterMarkContent水印的文字
* @paramg
* @return水印文字总长度
*/
public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
}
}
将file文件转化为MultipartFile类型文件
//将文件转化为MultipartFile类型文件
public static MultipartFile getMultipartFile(File file) {
FileItem item = new DiskFileItemFactory().createItem("file"
, MediaType.MULTIPART_FORM_DATA_VALUE
, true
, file.getName());
try (InputStream input = new FileInputStream(file);
OutputStream os = item.getOutputStream()) {
// 流转移
IOUtils.copy(input, os);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
return new CommonsMultipartFile(item);
}
引用图片加水印后下载(满屏水印,单个水印,可自定义角度)_watermark image 打全屏水印_骨力的博客-CSDN博客