Java实现为图片添加水印功能

 更新时间:2025年02月26日 09:10:49   作者:Katie。  
在图像处理领域,水印是一种常见的保护版权和标识图片归属的方法,Java提供了强大的图像处理能力,可以通过Graphics2D类在图像上绘制水印,下面我们来看看具体操作步骤吧

项目背景

在图像处理领域,水印是一种常见的保护版权和标识图片归属的方法。水印可以是文字、水印图片或透明图层,它通常位于图片的中央或角落。在很多应用中,例如图片共享、相册管理等,我们可能需要在图像上添加水印。

Java提供了强大的图像处理能力,可以通过Graphics2D类在图像上绘制水印。本项目的目标是实现一个Java程序,能够将文字或图片水印添加到图像上,并将修改后的图像保存为文件。

相关知识

1.BufferedImage

BufferedImage是Java中用来表示图像的类,它允许对图像进行像素级别的操作。图像可以通过Graphics2D进行绘制、缩放、添加水印等。

2.Graphics2D

Graphics2D是Graphics的一个子类,用于图形绘制。通过Graphics2D,我们可以在图像上绘制各种元素,如文本、图片、形状等,并控制绘制的透明度、颜色、字体等属性。

3.ImageIO

ImageIO类用于从文件读取图像,或将图像保存为指定格式的文件(如PNG、JPEG等)。

实现思路

加载图像:使用ImageIO.read()从文件中加载图像。

添加水印:

文字水印:通过Graphics2D的drawString()方法在图像上绘制文本。

图片水印:通过Graphics2D的drawImage()方法将另一张图片作为水印绘制到目标图像上。

保存图像:使用ImageIO.write()将修改后的图像保存为文件。

实现代码

以下是一个实现为图片添加文字水印和图片水印的Java程序:

Java代码:添加水印并保存图像

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
 
public class ImageWatermark {
 
    public static void main(String[] args) {
        try {
            // 1. 加载图像
            File inputFile = new File("path/to/your/image.jpg");  // 修改为你的图片路径
            BufferedImage image = ImageIO.read(inputFile);
 
            // 2. 添加文字水印
            String textWatermark = "Sample Watermark";
            BufferedImage textWatermarkedImage = addTextWatermark(image, textWatermark);
 
            // 3. 添加图片水印
            File watermarkImageFile = new File("path/to/your/watermark_image.png");  // 修改为水印图片路径
            BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);
            BufferedImage finalImage = addImageWatermark(textWatermarkedImage, watermarkImage);
 
            // 4. 保存添加水印后的图像
            File outputFile = new File("path/to/save/watermarked_image.png");  // 输出文件路径
            ImageIO.write(finalImage, "PNG", outputFile);  // 保存为PNG格式
 
            System.out.println("Watermark added and image saved successfully!");
 
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    // 添加文字水印
    private static BufferedImage addTextWatermark(BufferedImage originalImage, String watermarkText) {
        Graphics2D g2d = (Graphics2D) originalImage.getGraphics();
 
        // Set font and transparency
        Font font = new Font("Arial", Font.BOLD, 50);
        g2d.setFont(font);
        g2d.setColor(new Color(255, 255, 255, 128));  // 白色且半透明
 
        // Get the watermark's position (center the watermark on the image)
        FontMetrics fontMetrics = g2d.getFontMetrics();
        int x = (originalImage.getWidth() - fontMetrics.stringWidth(watermarkText)) / 2;
        int y = originalImage.getHeight() / 2;
 
        // Draw watermark text
        g2d.drawString(watermarkText, x, y);
 
        // Dispose the graphics context
        g2d.dispose();
 
        return originalImage;
    }
 
    // 添加图片水印
    private static BufferedImage addImageWatermark(BufferedImage originalImage, BufferedImage watermarkImage) {
        Graphics2D g2d = (Graphics2D) originalImage.getGraphics();
 
        // Get the watermark image's position (bottom-right corner)
        int x = originalImage.getWidth() - watermarkImage.getWidth() - 10;  // 10px margin from the right edge
        int y = originalImage.getHeight() - watermarkImage.getHeight() - 10;  // 10px margin from the bottom edge
 
        // Draw watermark image with transparency
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));  // Set transparency
        g2d.drawImage(watermarkImage, x, y, null);
 
        // Dispose the graphics context
        g2d.dispose();
 
        return originalImage;
    }
}

代码解读

1.加载图像:

使用ImageIO.read(inputFile)读取指定路径的图像文件并将其存储在BufferedImage对象中。

2.添加文字水印:

使用Graphics2D对象的drawString()方法在图像上绘制文字水印。我们设置了字体、颜色(白色且带有透明度)以及位置(居中)。

g2d.setColor(new Color(255, 255, 255, 128))设置文字的颜色为白色,并带有128的透明度。

3.添加图片水印:

使用Graphics2D对象的drawImage()方法将另一个图像作为水印绘制到目标图像的右下角。

通过AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)设置透明度,使水印图片具有50%的透明度。

4.保存图像:

使用ImageIO.write()方法将添加水印后的图像保存为PNG格式。

5.资源管理:

g2d.dispose()释放Graphics2D对象占用的资源,防止内存泄漏。

常见的水印操作

1.文字水印:

可以调整字体、颜色、大小、透明度等属性来控制水印的外观。字体可以使用Font类设置,颜色使用Color类设置。

文字水印的位置可以通过计算图像的宽度和文字的宽度来确定,使其居中或位于指定位置。

2.图片水印:

使用drawImage()方法绘制另一张图像作为水印。可以调整水印的位置、大小、透明度等。

水印图片的透明度通过AlphaComposite类设置。

3.透明度控制:

对于图片水印,透明度的控制是非常重要的。通过设置AlphaComposite的值,可以让水印图片更加隐约,从而不遮盖原图的细节。

4.水印位置:

文字水印的位置可以选择居中或定位置。图片水印常见位置有右下角、左下角、右上角等。通过坐标计算可以实现灵活定位。

项目总结

通过本项目,我们实现了一个简单的Java程序,能够在图像上添加文字水印和图片水印。使用Graphics2D类,我们可以灵活地控制水印的外观,包括位置、透明度、颜色等,并通过ImageIO.write()保存修改后的图像。

优化方向:

自定义水印样式:可以为文字水印提供更多的自定义选项,比如字体、大小、颜色、透明度等。

批量水印添加:可以扩展程序,支持批量处理多个图像文件,并添加统一的水印。

图形界面:可以为程序添加图形界面,允许用户通过界面选择水印类型(文字或图片)、位置、透明度等参数。

通过这个项目,您可以掌握如何使用Java进行图像水印的处理,适用于版权保护、品牌宣传、图片批量处理等场景。

到此这篇关于Java实现为图片添加水印功能的文章就介绍到这了,更多相关Java图片添加水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成Eclipse Mosquitto的实现示例

    SpringBoot集成Eclipse Mosquitto的实现示例

    本文主要介绍了SpringBoot集成Eclipse Mosquitto的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-08-08
  • mybatis-plus如何修改日志只打印SQL语句不打印查询结果

    mybatis-plus如何修改日志只打印SQL语句不打印查询结果

    这篇文章主要介绍了mybatis-plus如何修改日志只打印SQL语句不打印查询结果问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • SpringBoot电脑商城项目删除收货地址的实现方法

    SpringBoot电脑商城项目删除收货地址的实现方法

    这篇文章主要介绍了SpringBoot项目--电脑商城删除收货地址功能实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 详解eclipse项目中.classpath文件的使用

    详解eclipse项目中.classpath文件的使用

    这篇文章主要介绍了详解eclipse项目中.classpath文件的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Jmeter后置处理器实现过程及方法应用

    Jmeter后置处理器实现过程及方法应用

    这篇文章主要介绍了Jmeter后置处理器实现过程及方法应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 关于Mybatis 中使用Mysql存储过程的方法

    关于Mybatis 中使用Mysql存储过程的方法

    这篇文章给大家介绍了Mybatis 中使用Mysql存储过程的方法,本文通过实例代码相结合的形式给大家介绍的非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2018-03-03
  • Java实现花卉管理系统

    Java实现花卉管理系统

    这篇文章主要为大家详细介绍了Java实现花卉管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • java 反射和动态代理详解及实例代码

    java 反射和动态代理详解及实例代码

    这篇文章主要介绍了java 反射和动态代理详解及实例代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • ShardingSphere jdbc集成多数据源的实现步骤

    ShardingSphere jdbc集成多数据源的实现步骤

    本文主要介绍了ShardingSphere jdbc集成多数据源的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Java语言----三种循环语句的区别介绍

    Java语言----三种循环语句的区别介绍

    下面小编就为大家带来一篇Java语言----三种循环语句的区别介绍。小编举得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07

最新评论