java 给图片加水印的方式
代码可以直接使用 代码片
.
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
public class ImageUtil {
// 水印字体
private static final Font FONT = new Font("微软雅黑", Font.PLAIN, 14);
// 透明度
private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.1f);
// 水印之间的间隔
private static final int XMOVE = 60;
// 水印之间的间隔
private static final int YMOVE = 82;
/**
* @param pressText 水印文案
* @param targetImg 目标图片地址
* @param color 字体颜色
* @param fileSuffix
*/
public static void pressTest(String pressText, String targetImg, Color color, String fileSuffix) {
try {
File file = new File(targetImg);
Image src = ImageIO.read(file);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Graphics2D graphics = image.createGraphics( );
graphics.drawImage(src,0,0,width,height,null);
graphics.setColor(color);
// 设置水印透明度
graphics.setComposite(COMPOSITE);
// 设置倾斜角度
graphics.rotate(Math.toRadians(-35), (double) image.getWidth() / 2, (double) image.getHeight() / 2);
// 设置水印字体
graphics.setFont(FONT);
// 消除java.awt.Font字体的锯齿
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
int x = -width / 2;
int y;
// 字体长度
int markWidth = FONT.getSize() * getTextLength(pressText);
// 字体高度
int markHeight = FONT.getSize();
// 循环添加水印
while (x < width * 1.5) {
y = -height / 2;
while (y < height * 1.5) {
graphics.drawString(pressText, x, y);
y += markHeight + YMOVE;
}
x += markWidth + XMOVE;
}
graphics.dispose();
FileOutputStream fileOutputStream = new FileOutputStream(targetImg);
ImageIO.write(image, fileSuffix, fileOutputStream);
fileOutputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
//计算水印文本长度
//1、中文长度即文本长度 2、英文长度为文本长度二分之一
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;
}
}