接到一个新需求,上传图片后添加水印
先测试本地图片加水印
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 給图片添加文字水印
*
*
*/
public class WaterMarkUtils {
/**
* @param args
*/
public static void main(String[] args) {
// 原图位置, 输出图片位置, 水印文字颜色, 水印文字
try {
// 读取原图片信息
File srcImgFile = new File("C:/Users/Administrator/Desktop/测试用图/2.jpg");
Image srcImg = ImageIO.read(srcImgFile);
int srcImgWidth = srcImg.getWidth(null);
int srcImgHeight = srcImg.getHeight(null);
// 加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth,
srcImgHeight,
BufferedImage.TYPE_INT_RGB);
//获取 Graphics2D 对象
Graphics2D g = bufImg.createGraphics();
//设置绘图区域
g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
//设置字体
Font font = new Font("宋体", Font.PLAIN, 20);
// 根据图片的背景设置水印颜色
g.setColor(Color.green);
g.setFont(font);
//获取文字长度
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(new Date().getTime());
int len = g.getFontMetrics(
g.getFont()).charsWidth(format.toCharArray(),
0,
format.length());
int x = srcImgWidth - len - 10;
int y = srcImgHeight - 20;
g.drawString(format, x, y);
g.dispose();
// 输出图片
FileOutputStream outImgStream = new FileOutputStream("C:/Users/Administrator/Desktop/1/2.jpg");
ImageIO.write(bufImg, "png", outImgStream);
outImgStream.flush();
outImgStream.close();
System.out.println("添加水印完成");
} catch (Exception e) {
e.printStackTrace();
}
}
}
经测试,能正常使用
实际项目中使用的是MultipartFile上传图片
我最开始想到的是一个笨方法,先上传到本地,处理好水印之后再上上传到ftp,后来发现可以只用上传一次处理
public MultipartFile addWorkMarkToMutipartFile(MultipartFile multipartFile) throws IOException {
// 获取图片文件名 xxx.png xxx
String originFileName = multipartFile.getOriginalFilename();
// 获取原图片后缀 png
int lastSplit = originFileName.lastIndexOf(".");
String suffix = originFileName.substring(lastSplit + 1);
// 获取图片原始信息
String dOriginFileName = multipartFile.getOriginalFilename();
String dContentType = multipartFile.getContentType();
// 是图片且不是gif才加水印
if (!suffix.equalsIgnoreCase("gif") && dContentType.contains("image")) {
// 获取水印图片
InputStream inputImg = multipartFile.getInputStream();
Image img = ImageIO.read(inputImg);
// 加图片水印
int imgWidth = img.getWidth(null);
int imgHeight = img.getHeight(null);
BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight,
BufferedImage.TYPE_INT_RGB);
//调用画文字水印的方法
markWord(bufImg, img);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
ImageOutputStream imOut = ImageIO.createImageOutputStream(bs);
ImageIO.write(bufImg, suffix, imOut);
InputStream is = new ByteArrayInputStream(bs.toByteArray());
// 加水印后的文件上传
multipartFile = new MockMultipartFile(dOriginFileName, dOriginFileName, dContentType, is);
}
return multipartFile;
}
后面是上传图片逻辑,这里省略
测试
ftp服务器上的图片