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] 之内(包含边界值)的一个浮点数字
);
水印要考虑的字体大小问题
客户或需求设计时会有个默认字号,例如初号(42号字体,56像素)。
正常来说,固定设置这么大的字体没问题。
但是如果图片比较小,还设置初号,很明显字体超过边界了。这时应该适当调整大小。
方案:
如果图片大小>水印大小,那么居中展示。
如果图片大小<水印大小,水印进行缩放。
图片小的情况还需要区分下。
一种是横向长条状。
短长条。 根据图片宽度和字符个数计算出字符宽度(即高度,因为汉字是方块字,宽高一样)。
长长条。 字体高度设置为图片高度即可。
一种是竖向长条状。
水印进行缩放。
水印位置不在中间问题
水印成功生成,但是发现没在正中央,肯定要解决掉。
尤其是这两句不太好懂,什么叫做相对于中间偏移。。。
0, // x坐标修正值。 默认在中间,偏移量相对于中间偏移
0, // y坐标修正值。 默认在中间,偏移量相对于中间偏移
弄半天也没弄懂,试了半天尺寸也不合适。
后来突发奇想,是不是内部有什么计算的逻辑。翻了下代码,果然找到了。
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);
}
关键的就是这一句:
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();
这个height传给y坐标修正值即可。