原创

基于Graphics2D上传图片添加自定义水印

温馨提示:
本文最后更新于 2024年03月28日,已超过 300 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

今天实现一个小需求:给网站上传的图片添加个性水印,实现一个个性化定制,虽说暂时个生存在网络边缘的小破站,咱也是个有理想的小破站不是,先把逼格整上去再说。

技术背景

Java绘图库:java.awt.*

Java的绘图库提供了丰富的绘图功能,其中Graphics2D类是我们添加水印的主要工具。可以通过Graphics2D类绘制各种文本、图形等各种元素

图像I/O库:javax.imageio.*

图像I/O库提供了图像的读取和写入功能,通过ImageIO类,可以轻松地读取和写入多种格式的图像文件,如JPEG、PNG等

变换与旋转

AffineTransform类可以用来实现图形的变换和旋转。通过调整变换矩阵,可以实现水印的倾斜、旋转等效果

使用Graphics2D实现该功能,代码实现没有任何难度,如下:

public static void addTextWatermark2(File imageFile, String text, File outputFile) throws Exception {
    BufferedImage image = ImageIO.read(imageFile);
    Graphics2D g2d = (Graphics2D) image.getGraphics();
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g2d.setColor(Color.RED);
    g2d.setFont(new Font("黑体", Font.BOLD, 36));
    g2d.drawString(text, 10, 50);
    g2d.dispose();
    ImageIO.write(image, "jpg", outputFile);
}

于是赶紧来测试一下,发现几个了几个细节问题需要考虑:

  • 颜色:水印字体颜色不要太深,避免遮挡图片内容
  • 数量:水印数量根据图片大小自适应生成
  • 倾斜:水印字体有一定倾斜角度,避免与图片文字过于重叠
  • 字体:字体大小可以根据图片大小自适应,但不要过大而遮蔽图片内容
  • 位置:从图片底部开始生成水印

于是一阵捣鼓,主要针对细节问题进行调整和测试,对边界场景细节要注意把控,特别是小尺寸图片字体大小、水印数量、位置以及旋转角度控制,保证即使极小图片也至少有一个水印,代码及效果如下:
图片水印

emm...怎么说呢,总结几点吧:

  • 对于不同尺寸图片水印细节需要花足够时间来处理
  • 根据不同审美水印感受差别很大,个人最后觉得浅灰色(128, 128, 128)最为适合
  • 服务器没有相应字体,需要自己安装处理或者在项目中使用本地字体库,如果都懒得干直接使用非中文水印简单了事😂
正文到此结束
本文目录