现在基本上都是使用Spring、SpringMVC开发JavaWeb项目了,所以这里笔者就以SpringMVC上传为例进行示范。 首先,用你最熟悉的IDE工具(Eclipse、IDEA等)打开你的JavaWeb工程,新建一个util工具类。
代码语言:javascript复制/**
* 加文字水印
* @param bufImg --BufferedImage 用来画图的宽高跟需要加水印的图片一样的空白图
* @param img --需要加水印的图片
* @param text --水印文字
* @param font --字体
* @param color --颜色
* @param x --水印相对于底片的x轴坐标(PS:左上角为(0,0))
* @param y --水印相对于底片的y轴坐标(PS:左上角为(0,0))
* @author 上官江北
* @version 2019年01月29日 下午22:55:57
*/
public static void markWord(BufferedImage bufImg, Image img, String text, Font font, Color color, int x, int y) {
//取到画笔
Graphics2D g = bufImg.createGraphics();
//画底片
g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
g.setColor(color);
g.setBackground(Color.BLACK);
g.setFont(font);
//位置
g.drawString(text, x, y);
g.dispose();
以及对添加水印的文字进行处理
代码语言:javascript复制 /**
* 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
* @param text
* @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.
*/
public static int getLength(String text) {
int textLength = text.length();
int length = textLength;
for (int i = 0; i < textLength; i ) {
if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
length ;
}
}
return (length % 2 == 0) ? length / 2 : length / 2 1;
}
最后对MultipartFile对象做处理,也就是添加文字水印,再返回已添加好的MultipartFile对象给Controller层,这样上传到服务器端就是有带文字水印的图片了
代码语言:javascript复制/**
* 直接给multipartFile加上文字水印再进行保存图片的操作方便省事
*
* @param multipartFile 文件上传的对象
* @param word 水印文字
* @return 返回添加后的MultipartFile对象
* @throws IOException
* @author 上官江北
* @version 2019年01月29日 下午22:55:57
*/
public static MultipartFile addWorkMarkToMutipartFile(MultipartFile multipartFile,
String word) 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);
//设置字体
int size=bufImg.getWidth()/16;
Font font = new Font("宋体", Font.PLAIN, size);
//调用画文字水印的方法
int x=(imgWidth - (getLength(word) * bufImg.getWidth()/16)) / 2 10;
int y=(imgHeight - bufImg.getWidth()/16) / 2 10;
markWord(bufImg, img, word, font , Color.GREEN, x, y);
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;
}
上传前原图:
经过后台添加水印处理后图片: