使用Java给图片添加水印

  什么是水印呢?比如使用手机拍摄一张照片的时候,照片右下角的位置显示得有日期和时间信息,那就表示一个水印。

 

项目开发中给图片添加水印的操作很常见,比如给图片添加日期和时间,给图片添加公司的logo之类的等等。下面就来聊聊如何使用Java来给图片添加水印。

大致的思路如下

实现方式:读取原图片信息转为 BufferedImage对象;然后利用 BufferedImage 创建 Graphics2D画笔对象,再使用绘图对象中的API进行相应的操作。

实现步骤:

(1)读取原图片数据。

(2)根据原图片数据生成一张新空白图片

(3)获取新图片的画笔对象

(4)将原图片画在新图片中

(5)使用画笔设置水印内容相关信息如颜色、字体位置等。

(6)保存新生成的图片数据。

 

涉及到的主要类有.

.1.BufferedImage 图片缓冲类

 

.2.Graphics2D 画笔类

常用方法

drawImage() 表示绘制图片

setColor() 设置颜色

setFont() 设置字体

drawString(String str,  int x,  int y) 表示设置绘画内容

参数一: 绘制的"内容";

参数二: 内容在图片中的x坐标,

参数三: 内容在图片中的y坐标

 

dispose() 表示释放资源

 

.4.ImageIO Java操作图片文件的类

 

常用方法

ImageIO.read(File对象)

表示读取图片文件数据

 

ImageIO.write(RenderedImage im, String formatName, OutputStream output);

向输出流中写入图片数据,有三个参数

参数一: 表示缓冲图片对象

参数二: 表示设置格式化名称

 

参考示例代码如下:

    /**

     * 添加水印

     * @param sourceImg 原图片对象

     * @param textColor 文本颜色

     * @param fontSize  字体大小

     * @param text      文本内容

     * @param outPath   图片输出路径

     */

    public static void addTextWaterMark(BufferedImage sourceImg, Color textColor, int fontSize, String text, String outPath) {

        // 获取原图片的宽

        int width = sourceImg.getWidth();

        // 获取原图片的高

        int height = sourceImg.getHeight();

        // 创建一个与原图片大小相同的图片

        BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);

        // 获取图片的画笔对象

        Graphics2D gph = bufferedImage.createGraphics();

        // 将原图片绘制到空白图片上

        gph.drawImage(sourceImg, 0, 0, width, height, null);

        // 设置水印颜色

        gph.setColor(textColor);

        // 设置水印字体

        gph.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));

        // 设置水印内容放置位置

//            int x = width - (text.length() + 1) * fontSize;

//            int y = height- fontSize * 2;

        int x = width - 6 * fontSize;

        int y = height - fontSize / 2;

        // 设置水印内容

        gph.drawString(text, x, y);

 

        try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outPath));) {

            // 保存新生成的图片

            ImageIO.write(bufferedImage, "jpg", bos);

        } catch (Exception ex) {

            ex.printStackTrace();

        } finally {

            // 释放资源

            gph.dispose();

        }

}

说明:操作IO流的时候,能使用带缓冲区的类尽量使用,在一定程度上可以提升文件操作的效率。

然后写一段简单的测试代码如下:

 // 读取图片文件信息

        File file = new File("C:\\Users\\xxx\\Desktop\\temp.png");

        // 将图片文件转换为 BufferedImage 对象

        BufferedImage image = ImageIO.read(file);

        addTextWaterMark(image, Color.RED, 80, "2024-03-14", "C:\\Users\\xxx\\Desktop\\temp.jpg");

        System.out.println("图片处理完成");

在一张图片中的右下角添加一个日期,测试结果如下:

字体的大小,颜色,样式等内容都可以自己根据需要进行调整。

posted @ 2024-03-19 11:47  一只爱阅读的程序员  阅读(1100)  评论(0编辑  收藏  举报