java给图片加水印


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坐标修正值即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值