文章目录
  • hutool给图片加水印
  • 水印位置不在中间问题



java给图片加水印,方法不只一种。

hutool给图片加水印

官网的代码例子就很好:

ImgUtil.pressText(
    FileUtil.file(inFilePath), //
    FileUtil.file(outFilePath), //
    "水印文字", Color.BLACK, // 水印文字
    new Font("黑体", Font.BOLD, 56), // 
    0, // x坐标修正值。 默认在中间,偏移量相对于中间偏移
    0, // y坐标修正值。 默认在中间,偏移量相对于中间偏移
    0.5f //透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
水印位置不在中间问题

水印成功生成,但是发现没在正中央,肯定要解决掉。

尤其是这两句不太好懂,什么叫做相对于中间偏移。。。

0, // x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, // y坐标修正值。 默认在中间,偏移量相对于中间偏移
  • 1.
  • 2.

弄半天也没弄懂,试了半天尺寸也不合适。

后来突发奇想,是不是内部有什么计算的逻辑。翻了下代码,果然找到了。
cn.hutool.core.img.FontUtill类:

public static Dimension getDimension(FontMetrics metrics, String str) {
    int width = metrics.stringWidth(str);
    int height = metrics.getAscent() - metrics.getLeading() - metrics.getDescent();
    return new Dimension(width, height);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

关键的就是这一句:
int height = metrics.getAscent() - metrics.getLeading() - metrics.getDescent(); 因此:
y坐标修正值,填这个值就是正确的

代码:

Font font = new Font("黑体", Font.BOLD, 56);
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
int height = metrics.getAscent() - metrics.getLeading() - metrics.getDescent();
  • 1.
  • 2.
  • 3.

这个height传给y坐标修正值即可。