import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WaterMarkUtils {
public static final String MARK_TEXT = "你好世界!" ;
// 设置字体
public static final String FONT_NAME = "宋体" ;
// 字体大小
public static final int FONT_SIZE = 50 ;
// 字体样式,是否加粗,斜体
public static final int FONT_STYPE = Font.TRUETYPE_FONT ;
// 字体颜色
public static final Color FONT_COLOR = Color.white ;
public static final int X = 20 ;
public static final int Y = 1400 ;
// 透明度 1为不透明,越小透明度越高 0.3F
public static float ALPHA = 1F ;
public static String watermark(CommonsMultipartFile file, String uploadPath, String realUploadPath,String dateTime,String markInfoName) {
// TODO Auto-generated method stub
String logoFileName = file.getOriginalFilename() ;
OutputStream os = null ;
try {
Image image2 = ImageIO.read(file.getInputStream()) ;
int width = image2.getWidth(null) ;
int height = image2.getHeight(null) ;
BufferedImage bufferImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) ;
// 创建Graphics2D对象,用在底图对象上绘图
Graphics2D g = bufferImage.createGraphics() ;
g.drawImage(image2, 0, 0, width, height, null) ;
g.setFont(new Font(FONT_NAME,FONT_STYPE,FONT_SIZE));
g.setColor(FONT_COLOR) ;
int width1 = FONT_SIZE*getTextLength(dateTime) ;
int height1 = FONT_SIZE ;
int widthDiff = width-width1 ;
int heightDiff = height-height1 ;
int x = X ;
int y = Y ;
if(x>widthDiff) {
x = widthDiff ;
}
if(y>heightDiff) {
y=heightDiff ;
}
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
// 根据图片的长和宽来固定水印的位置
g.drawString(dateTime, X, height-100) ;
g.drawString(markInfoName , X, height-45) ;
g.dispose() ;
// g.drawString 向图片上写水印内容,可以多次写入不同的内容,记得调整内容在图片中的位置
os = new FileOutputStream(realUploadPath+"/"+logoFileName) ;
JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(os) ;
en.encode(bufferImage) ;
} catch(Exception e) {
e.printStackTrace() ;
} finally {
if(os!=null) {
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return uploadPath;
}
public static int getTextLength(String text) {
int length = text.length();
for(int i=0; i<text.length(); i++) {
String s = String.valueOf(text.charAt(i)) ;
if(s.getBytes().length>1) {
length++ ;
}
}
length = length%2==0?length/2:length/2+1 ;
return length ;
}
}
注: 水印使用的字体服务器上也要安装了相关字体,要不然打出来的中文都是乱码