Java图片水印案例怎么添加

wen java案例 27

本文目录导读:

Java图片水印案例怎么添加

  1. 基本环境配置
  2. 文字水印添加
  3. 图片水印添加
  4. 高级功能:平铺水印
  5. 完整的工具类
  6. 注意事项

我来为您介绍Java中添加图片水印的完整案例,包括文字水印和图片水印两种方式。

基本环境配置

首先需要添加依赖(Maven项目):

<dependency>
    <groupId>javax.media</groupId>
    <artifactId>jai_core</artifactId>
    <version>1.1.3</version>
</dependency>

文字水印添加

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class TextWatermark {
    /**
     * 添加文字水印
     * @param sourcePath 原图路径
     * @param targetPath 目标路径
     * @param text 水印文字
     * @param fontSize 字体大小
     */
    public static void addTextWatermark(String sourcePath, String targetPath, 
                                       String text, int fontSize) {
        try {
            // 读取原图片
            File sourceFile = new File(sourcePath);
            BufferedImage originalImage = ImageIO.read(sourceFile);
            // 创建图形对象
            Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
            // 设置抗锯齿
            graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                                       RenderingHints.VALUE_ANTIALIAS_ON);
            graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                                       RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            // 设置字体和颜色
            Font font = new Font("微软雅黑", Font.BOLD, fontSize);
            graphics2D.setFont(font);
            graphics2D.setColor(new Color(255, 255, 255, 128)); // 白色半透明
            // 计算文字位置(右下角)
            FontMetrics fontMetrics = graphics2D.getFontMetrics();
            int textWidth = fontMetrics.stringWidth(text);
            int textHeight = fontMetrics.getHeight();
            int x = originalImage.getWidth() - textWidth - 20;
            int y = originalImage.getHeight() - textHeight - 20;
            // 绘制文字水印
            graphics2D.drawString(text, x, y);
            // 释放资源
            graphics2D.dispose();
            // 输出图片
            ImageIO.write(originalImage, "jpg", new File(targetPath));
            System.out.println("文字水印添加成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        addTextWatermark("input.jpg", "output_text.jpg", "© 我的水印", 36);
    }
}

图片水印添加

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageWatermark {
    /**
     * 添加图片水印
     * @param sourcePath 原图路径
     * @param watermarkPath 水印图路径
     * @param targetPath 目标路径
     * @param opacity 透明度(0.0-1.0)
     */
    public static void addImageWatermark(String sourcePath, String watermarkPath, 
                                        String targetPath, float opacity) {
        try {
            // 读取原图和水印图
            BufferedImage originalImage = ImageIO.read(new File(sourcePath));
            BufferedImage watermarkImage = ImageIO.read(new File(watermarkPath));
            // 创建图形对象
            Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
            // 设置透明度
            graphics2D.setComposite(AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, opacity));
            // 计算水印位置(右下角)
            int watermarkWidth = watermarkImage.getWidth();
            int watermarkHeight = watermarkImage.getHeight();
            int x = originalImage.getWidth() - watermarkWidth - 20;
            int y = originalImage.getHeight() - watermarkHeight - 20;
            // 绘制水印
            graphics2D.drawImage(watermarkImage, x, y, null);
            // 释放资源
            graphics2D.dispose();
            // 输出图片
            ImageIO.write(originalImage, "jpg", new File(targetPath));
            System.out.println("图片水印添加成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        addImageWatermark("input.jpg", "watermark.png", "output_image.jpg", 0.5f);
    }
}

高级功能:平铺水印

public class TileWatermark {
    /**
     * 平铺水印(重复铺满整个图片)
     */
    public static void addTileWatermark(String sourcePath, String watermarkPath, 
                                       String targetPath, float opacity) {
        try {
            BufferedImage originalImage = ImageIO.read(new File(sourcePath));
            BufferedImage watermarkImage = ImageIO.read(new File(watermarkPath));
            Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
            graphics2D.setComposite(AlphaComposite.getInstance(
                AlphaComposite.SRC_OVER, opacity));
            int watermarkWidth = watermarkImage.getWidth();
            int watermarkHeight = watermarkImage.getHeight();
            // 平铺水印
            for (int y = 0; y < originalImage.getHeight(); y += watermarkHeight + 20) {
                for (int x = 0; x < originalImage.getWidth(); x += watermarkWidth + 20) {
                    graphics2D.drawImage(watermarkImage, x, y, null);
                }
            }
            graphics2D.dispose();
            ImageIO.write(originalImage, "jpg", new File(targetPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

完整的工具类

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class WatermarkUtils {
    /**
     * 添加水印(支持文字和图片)
     * @param sourceFile 源文件
     * @param watermarkType 水印类型("text"或"image")
     * @param watermarkContent 水印内容(文字内容或图片路径)
     * @param position 位置("top-left","top-right","bottom-left","bottom-right","center")
     * @param opacity 透明度
     */
    public static void addWatermark(File sourceFile, String watermarkType, 
                                   String watermarkContent, String position, 
                                   float opacity) {
        try {
            BufferedImage image = ImageIO.read(sourceFile);
            Graphics2D g2d = (Graphics2D) image.getGraphics();
            // 设置透明度
            g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
            if ("text".equals(watermarkType)) {
                // 文字水印
                g2d.setFont(new Font("微软雅黑", Font.BOLD, 30));
                g2d.setColor(Color.WHITE);
                FontMetrics metrics = g2d.getFontMetrics();
                int[] pos = calculatePosition(image, position, 
                    metrics.stringWidth(watermarkContent), metrics.getHeight());
                g2d.drawString(watermarkContent, pos[0], pos[1]);
            } else if ("image".equals(watermarkType)) {
                // 图片水印
                BufferedImage watermark = ImageIO.read(new File(watermarkContent));
                int[] pos = calculatePosition(image, position, 
                    watermark.getWidth(), watermark.getHeight());
                g2d.drawImage(watermark, pos[0], pos[1], null);
            }
            g2d.dispose();
            // 保存图片
            String outputPath = sourceFile.getParent() + "/watermarked_" + sourceFile.getName();
            ImageIO.write(image, "png", new File(outputPath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static int[] calculatePosition(BufferedImage image, String position, 
                                          int width, int height) {
        int x = 0, y = 0;
        int padding = 20;
        switch (position) {
            case "top-left":
                x = padding;
                y = padding + height;
                break;
            case "top-right":
                x = image.getWidth() - width - padding;
                y = padding + height;
                break;
            case "bottom-left":
                x = padding;
                y = image.getHeight() - padding;
                break;
            case "bottom-right":
                x = image.getWidth() - width - padding;
                y = image.getHeight() - padding;
                break;
            case "center":
                x = (image.getWidth() - width) / 2;
                y = (image.getHeight() - height) / 2;
                break;
        }
        return new int[]{x, y};
    }
    // 使用示例
    public static void main(String[] args) {
        // 文字水印
        addWatermark(new File("input.jpg"), "text", 
                    "© 我的水印", "bottom-right", 0.5f);
        // 图片水印
        addWatermark(new File("input.jpg"), "image", 
                    "watermark.png", "center", 0.3f);
    }
}

注意事项

  1. 图片格式支持:确保使用正确的输出格式(jpg、png等)
  2. 编码问题:中文字体可能需要在特定系统上配置
  3. 性能考虑:处理大图片时考虑使用缓冲流
  4. 异常处理:添加完整的异常处理逻辑

这个案例涵盖了Java图片水印添加的常用场景,您可以根据实际需求选择使用。

抱歉,评论功能暂时关闭!