Java为图片添加水印并保存实现方法(附带源码)

 更新时间:2025年03月20日 10:07:09   作者:Katie。  
这篇文章主要介绍了如何使用Java编程语言在图像上添加文字或图片水印,并提供了一个简单的Java程序实现,文中给出了详细的代码示例,需要的朋友可以参考下

项目背景

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

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

相关知识

BufferedImage

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

Graphics2D

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

ImageIO

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

实现思路

  • 加载图像:使用ImageIO.read()从文件中加载图像。
  • 添加水印
    • 文字水印:通过Graphics2DdrawString()方法在图像上绘制文本。
    • 图片水印:通过Graphics2DdrawImage()方法将另一张图片作为水印绘制到目标图像上。
  • 保存图像:使用ImageIO.write()将修改后的图像保存为文件。

实现代码

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

1. 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;
    }
}

代码解读

  • 加载图像

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

    • 使用Graphics2D对象的drawString()方法在图像上绘制文字水印。我们设置了字体、颜色(白色且带有透明度)以及位置(居中)。
    • g2d.setColor(new Color(255, 255, 255, 128))设置文字的颜色为白色,并带有128的透明度。
  • 添加图片水印

    • 使用Graphics2D对象的drawImage()方法将另一个图像作为水印绘制到目标图像的右下角。
    • 通过AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)设置透明度,使水印图片具有50%的透明度。
  • 保存图像

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

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

常见的水印操作

  • 文字水印

    • 可以调整字体、颜色、大小、透明度等属性来控制水印的外观。字体可以使用Font类设置,颜色使用Color类设置。
    • 文字水印的位置可以通过计算图像的宽度和文字的宽度来确定,使其居中或位于指定位置。
  • 图片水印

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

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

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

项目总结

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

优化方向

  • 自定义水印样式:可以为文字水印提供更多的自定义选项,比如字体、大小、颜色、透明度等。
  • 批量水印添加:可以扩展程序,支持批量处理多个图像文件,并添加统一的水印。
  • 图形界面:可以为程序添加图形界面,允许用户通过界面选择水印类型(文字或图片)、位置、透明度等参数。

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

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

相关文章

  • Java Yml格式转换为Properties问题

    Java Yml格式转换为Properties问题

    本文介绍了作者编写一个Java工具类来解决在线YAML到Properties转换时属性内容遗漏的问题,通过遍历YAML文件的树结构,作者成功实现了属性的完整转换,总结指出,该工具类适用于多种数据类型,并且代码简洁易懂
    2024-12-12
  • 23种设计模式(4) java生成器模式

    23种设计模式(4) java生成器模式

    这篇文章主要为大家详细介绍了23种设计模式之java生成器模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • SpringBoot项目创建使用+配置文件+日志文件详解

    SpringBoot项目创建使用+配置文件+日志文件详解

    Spring的出现是为了简化 Java 程序开发,而 SpringBoot 的出现是为了简化 Spring 程序开发,这篇文章主要介绍了SpringBoot项目创建使用+配置文件+日志文件,需要的朋友可以参考下
    2023-02-02
  • Spring Boot3 跨域配置 Cors的方式

    Spring Boot3 跨域配置 Cors的方式

    这篇文章主要介绍了Spring Boot3 跨域配置 Cors,通过使用CORS,开发人员可以控制哪些外部网页可以访问他们的资源,从而提高应用程序的安全性,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 如何去掉IntelliJ IDEA中mybatis对应的xml文件警告

    如何去掉IntelliJ IDEA中mybatis对应的xml文件警告

    这篇文章主要介绍了如何去掉IntelliJ IDEA中mybatis对应的xml文件警告问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Mybatis官方生成器的使用方式

    Mybatis官方生成器的使用方式

    本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Mapper接口和MapperXML文件,MBG通过配置文件和Maven插件,可以大大减少开发人员在进行CRUD操作时的重复工作,提升开发效率和代码一致性
    2025-01-01
  • 详解Java 连接MongoDB集群的几种方式

    详解Java 连接MongoDB集群的几种方式

    这篇文章主要介绍了详解Java 连接MongoDB集群的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 使用MyBatis拦截器实现SQL的完整打印

    使用MyBatis拦截器实现SQL的完整打印

    当我们使用Mybatis结合Mybatis-plus进行开发时,为了查看执行sql的信息通常我们可以通过属性配置的方式打印出执行的sql语句,但这样的打印出了sql语句常带有占位符信息,不利于排错,所以本文介绍了构建MyBatis拦截器,实现SQL的完整打印,需要的朋友可以参考下
    2024-07-07
  • java实现线上环境远程debug调试过程

    java实现线上环境远程debug调试过程

    本文介绍了在Docker容器中配置Tomcat和Spring Boot进行远程调试的方法,通过配置`CATALINA_OPTS`或`JPDA`参数,可以在测试环境中启动Tomcat或Spring Boot应用的debug模式,然后在本地IDEA中设置断点进行调试,从而更高效地定位和解决问题
    2025-02-02
  • 用Java8 stream处理数据

    用Java8 stream处理数据

    这篇文章主要介绍了用Java8 stream处理数据,Java 8 API的设计者重新提出了一个新的抽象称为流Stream,可以让我们以一种声明的方式处理数据,此外,数据流可以充分利用多核架构而无需编写多线程的一行代码,下面我们一起来看看文章详细介绍
    2021-11-11

最新评论