Java图片打水印

在很多应用场景中,我们需要在图片上添加水印来保护图片的版权,或者用于标识图片的来源等目的。在Java中,我们可以通过一些库来实现图片打水印的功能,下面我们就来介绍一种简单的实现方法。

1. 准备工作

在开始之前,我们需要准备两个重要的库:javax.imageiojava.awt.imagejavax.imageio提供了一组用于读取和写入图像的类,java.awt.image则提供了对图像处理的支持。

2. 实现步骤

2.1 读取原始图片

首先,我们需要读取一张原始图片。我们可以使用ImageIO类的read方法来读取一个File对象中的图片。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageUtils {
    public static BufferedImage readImage(String filePath) throws IOException {
        File file = new File(filePath);
        return ImageIO.read(file);
    }
}

2.2 添加水印

接下来,我们需要在原始图片上添加水印。我们可以通过Graphics2D类来实现在图片上绘制文本的功能。

import java.awt.*;
import java.awt.image.BufferedImage;

public class ImageUtils {
    public static void addWatermark(BufferedImage image, String watermarkText, int x, int y) {
        Graphics2D g2d = image.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setColor(Color.RED);
        g2d.setFont(new Font("Arial", Font.BOLD, 30));
        g2d.drawString(watermarkText, x, y);
        g2d.dispose();
    }
}

2.3 保存图片

最后,我们将添加水印后的图片保存到一个新的文件中。

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageUtils {
    public static void saveImage(BufferedImage image, String filePath, String formatName) throws IOException {
        File file = new File(filePath);
        ImageIO.write(image, formatName, file);
    }
}

3. 完整示例

下面是一个完整的示例代码,演示了如何读取一张图片,添加水印并保存。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class ImageUtils {
    public static BufferedImage readImage(String filePath) throws IOException {
        File file = new File(filePath);
        return ImageIO.read(file);
    }

    public static void addWatermark(BufferedImage image, String watermarkText, int x, int y) {
        Graphics2D g2d = image.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2d.setColor(Color.RED);
        g2d.setFont(new Font("Arial", Font.BOLD, 30));
        g2d.drawString(watermarkText, x, y);
        g2d.dispose();
    }

    public static void saveImage(BufferedImage image, String filePath, String formatName) throws IOException {
        File file = new File(filePath);
        ImageIO.write(image, formatName, file);
    }

    public static void main(String[] args) {
        try {
            BufferedImage image = readImage("original.jpg");
            addWatermark(image, "Watermark", 100, 100);
            saveImage(image, "watermarked.jpg", "JPG");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4. 状态图

下面是一个简单的状态图,展示了图片打水印的整个过程。

stateDiagram
    [*] --> ReadImage
    ReadImage --> AddWatermark
    AddWatermark --> SaveImage
    SaveImage --> [*]

5. 类图

我们还可以使用类图来展示整个程序的类结构。

classDiagram
    ImageUtils --|> Object
    ImageUtils : +readImage(String) : BufferedImage
    ImageUtils : +addWatermark(BufferedImage, String, int, int) : void
    ImageUtils : +saveImage(BufferedImage, String, String) : void

6. 总结

通过本文的介绍,我们了解了如何在Java中使用javax.imageiojava.awt.image库来实现图片打