Java生成文本水印,支持半透明背景、文字描边,能根据字体自适应宽高,有需要的小伙伴可根据自身情况调整。看效果~
暂不支持多行文字
微软雅黑
宋体
半透明背景
透明背景(字体有描边)
参考代码
public BufferedImage genTextWatermark(String text, int size, Color textColor, boolean bgMask, int padding) {
final Font font = new Font("微软雅黑", Font.BOLD, size);
FontMetrics fm = FontDesignMetrics.getMetrics(font);
int stringWidth = fm.stringWidth(text);
int stringHeight = fm.getHeight();
int ascent = fm.getAscent();
int imgWidth = stringWidth;
int imgHeight = stringHeight;
if (padding > 0) {
imgWidth += padding;
imgHeight += padding;
}
BufferedImage bufferedImage = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bufferedImage.createGraphics();
if (bgMask) {
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.15F));
g.setColor(Color.decode("#000000"));
g.fillRect(0, 0, imgWidth, imgHeight);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0F));
}
// 设置对线段的锯齿状边缘处理
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
int offsetX = padding / 2;
int offsetY = (ascent) + (padding / 2);
if (bgMask) {
g.setColor(textColor);
g.setFont(font);
g.drawString(text, offsetX, offsetY);
} else {
FontRenderContext frc = g.getFontRenderContext();
TextLayout tl = new TextLayout(text, font, frc);
Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(offsetX, offsetY));
//描边色
g.setColor(Color.decode("#010101"));
g.draw(sha);
//字体色
g.setColor(textColor);
g.fill(sha);
}
g.dispose();
return bufferedImage;
}



