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为图片添加水印并保存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot项目的服务器部署与发布方式

    Springboot项目的服务器部署与发布方式

    本文记录了将Springboot项目部署到服务器并发布的过程,包括在IDEA中打包、选择服务器、连接服务器、安装环境、上传jar包、配置环境变量以及运行项目等步骤
    2025-03-03
  • 如何通过jstack命令dump线程信息

    如何通过jstack命令dump线程信息

    这篇文章主要介绍了如何通过jstack命令dump线程信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java中的SecretKeyFactory类使用详解

    Java中的SecretKeyFactory类使用详解

    这篇文章主要介绍了Java中的SecretKeyFactory类使用详解,SecretKeyFactory表示私密密钥的工厂,密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),需要的朋友可以参考下
    2024-01-01
  • Java cookie和session会话技术介绍

    Java cookie和session会话技术介绍

    session的工作原理和cookie非常类似,在cookie中存放一个sessionID,真实的数据存放在服务器端,客户端每次发送请求的时候带上sessionID,服务端根据sessionID进行数据的响应
    2023-04-04
  • Java实现矩形碰撞检测

    Java实现矩形碰撞检测

    这篇文章主要为大家详细介绍了Java实现矩形碰撞检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    mybatis mapper.xml中如何根据数据库类型选择对应SQL语句

    这篇文章主要介绍了mybatis mapper.xml中如何根据数据库类型选择对应SQL语句,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 从0开始学习大数据之java spark编程入门与项目实践

    从0开始学习大数据之java spark编程入门与项目实践

    这篇文章主要介绍了从0开始学习大数据之java spark编程入门与项目实践,结合具体入门项目分析了大数据java spark编程项目建立、调试、输出等相关步骤及操作技巧,需要的朋友可以参考下
    2019-11-11
  • Java concurrency之公平锁(一)_动力节点Java学院整理

    Java concurrency之公平锁(一)_动力节点Java学院整理

    这篇文章主要为大家详细介绍了Java concurrency之公平锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Spring中使用腾讯云发送短信验证码的实现示例

    Spring中使用腾讯云发送短信验证码的实现示例

    本文主要介绍了Spring 中 使用腾讯云发送短信验证码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • java实现简单发送邮件功能

    java实现简单发送邮件功能

    这篇文章主要为大家详细介绍了java实现简单发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论