使用 Java 为图片添加各种样式的水印

2024-09-06 21:20
文章标签 java 使用 图片 样式 水印

本文主要是介绍使用 Java 为图片添加各种样式的水印,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在互联网时代,图像的版权保护变得越来越重要。水印作为一种常见的图像保护手段,可以有效防止未经授权的复制和使用。在本文中,我们将详细探讨如何在 Java 中为图片添加各种样式的水印,包括文本水印、图像水印、平铺水印等。通过这一系列的示例和代码实现,您将掌握如何利用 Java 来创建和应用水印,为您的图片增添一层保护。

1. 简介

水印是一种覆盖在图像表面上的标识,通常以文字或图像的形式存在。其主要目的是保护图像版权,防止他人在未经许可的情况下使用图片。水印有多种类型,常见的包括:

  • 文本水印:在图像上添加特定的文字信息,如作者名、公司名或版权声明等。
  • 图像水印:在图像上添加另一个图像作为水印,如公司 Logo 或品牌标识。
  • 平铺水印:将水印图像或文本重复覆盖整个图像区域,以增强保护效果。

接下来,我们将逐步介绍如何在 Java 中实现这些不同类型的水印,并探讨如何根据实际需求进行自定义和优化。

2. 水印的基本原理

在开始实现水印之前,我们需要了解水印的基本原理。无论是文本水印还是图像水印,其核心都是将水印内容绘制在目标图像上。Java 提供了强大的 Graphics2D 类,可以用来在图像上绘制各种图形和文本。

2.1 Graphics2D 简介

Graphics2Djava.awt.Graphics 类的子类,提供了更强大的图形处理能力。它支持复杂的图形操作,如旋转、缩放、变换、抗锯齿等。在添加水印时,我们将使用 Graphics2D 对象来绘制水印。

2.2 AlphaComposite 控制透明度

在为图片添加水印时,我们通常需要控制水印的透明度,使其不会完全遮盖住原图。Java 中的 AlphaComposite 类允许我们通过设置透明度来混合图像和水印。

2.3 水印的位置与布局

水印的位置是指在目标图像上的具体绘制位置。通常情况下,水印可以放置在图像的任意位置,如左上角、右下角、中心等。我们可以通过控制 Graphics2D 对象的绘制坐标来实现水印的位置调整。

3. 准备工作

在开始编写代码之前,我们需要准备一些工具和资源:

  • JDK:确保您已经安装了 JDK(Java Development Kit),建议使用最新版本的 JDK。
  • 图像处理库:Java 自带的 java.awt 包已经足够处理大部分图像和水印需求,无需额外引入库。
  • 待处理的图像:选择一张您希望添加水印的图像文件。

4. 实现文本水印

文本水印是最简单的一种水印形式,通常用于在图像上添加文字信息,如作者名、版权声明或其他标识。接下来我们将通过代码示例演示如何在 Java 中添加文本水印。

4.1 添加简单的文本水印

以下是一个简单的代码示例,展示了如何在图像的右下角添加一段文本作为水印。

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;public class TextWatermark {public static void addTextWatermark(String text, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();// 初始化水印文本的字体、颜色和透明度AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);g2d.setComposite(alphaChannel);g2d.setColor(Color.GRAY);g2d.setFont(new Font("Arial", Font.BOLD, 64));FontMetrics fontMetrics = g2d.getFontMetrics();int textWidth = fontMetrics.stringWidth(text);int textHeight = fontMetrics.getHeight();// 计算水印文本的位置(右下角)int x = sourceImage.getWidth() - textWidth - 10;int y = sourceImage.getHeight() - textHeight + 50;// 在图像上绘制水印文本g2d.drawString(text, x, y);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}}public static void main(String[] args) {File sourceImageFile = new File("src/main/resources/source-image.jpg");File destImageFile = new File("src/main/resources/watermarked-image.jpg");String watermarkText = "© 2024 MyCompany";addTextWatermark(watermarkText, sourceImageFile, destImageFile);}
}

在上面的代码中,我们首先加载源图像,然后使用 Graphics2D 对象在图像上绘制文本。AlphaComposite 用于设置水印的透明度。最后,将处理后的图像保存为一个新文件。

4.2 自定义水印位置

在实际应用中,我们可能需要将水印放置在图像的不同位置。以下是一个通过参数控制水印位置的示例:

public static void addTextWatermark(String text, File sourceImageFile, File destImageFile, int x, int y) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);g2d.setComposite(alphaChannel);g2d.setColor(Color.GRAY);g2d.setFont(new Font("Arial", Font.BOLD, 64));// 在指定位置绘制水印文本g2d.drawString(text, x, y);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

通过传入 xy 参数,我们可以灵活地控制水印文本的位置。例如:

int x = 100;
int y = 100;
addTextWatermark(watermarkText, sourceImageFile, destImageFile, x, y);

4.3 自定义水印样式

我们还可以通过调整字体、颜色和透明度等参数来自定义水印的样式,使其更加符合设计要求。

public static void addStyledTextWatermark(String text, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);g2d.setComposite(alphaChannel);g2d.setColor(Color.BLUE);g2d.setFont(new Font("Courier New", Font.ITALIC, 80));int x = 20;int y = 100;g2d.drawString(text, x, y);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Styled text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

在这个示例中,我们将字体更改为 Courier New,样式设为斜体,并将颜色设置为蓝色。

5. 实现图像水印

除了文本水印,图像水印也是一种常见的水印形式。图像水印通常用于添加公司 Logo 或品牌标识。在 Java 中实现图像水印的步骤与文本水印类似,只是将 drawString 替换为 drawImage

5.1 添加简单的图像水印

下面是一个将 Logo 作为水印添加到目标图像的示例:

public static void addImageWatermark(File watermarkImageFile, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();// 设置透明度AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);g2d.setComposite(alphaChannel);// 计算水印位置(右下角)int x = sourceImage.getWidth() - watermarkImage.getWidth() - 10;int y = sourceImage.getHeight() - watermarkImage.getHeight() - 10;// 绘制水印图像g2d.drawImage(watermarkImage, x, y, null);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Image watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

在这个例子中,我们将水印图像放置在目标图像的右下角,并设置了透明度。只需替换不同的水印图像文件,即可应用不同的水印。

5.2 自定义图像水印大小

有时,水印图像的尺寸可能与目标图像不匹配。在这种情况下,我们可以对水印图像进行缩放,使其适应目标图像的大小。

public static void addScaledImageWatermark(File watermarkImageFile, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);// 对水印图像进行缩放int scaledWidth = sourceImage.getWidth() / 5;int scaledHeight = watermarkImage.getHeight() * scaledWidth / watermarkImage.getWidth();Image scaledWatermark = watermarkImage.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);g2d.setComposite(alphaChannel);int x = sourceImage.getWidth() - scaledWidth - 10;int y = sourceImage.getHeight() - scaledHeight - 10;g2d.drawImage(scaledWatermark, x, y, null);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Scaled image watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

此示例中,我们将水印图像缩放为目标图像宽度的五分之一,以确保水印在视觉上更加和谐。

6. 实现平铺水印

平铺水印是一种将水印重复覆盖整个图像的技术,以增加图像的保护难度。平铺水印可以是文本,也可以是图像。接下来我们将介绍如何在 Java 中实现平铺水印。

6.1 平铺文本水印

我们首先来看如何实现平铺文本水印:

public static void addTiledTextWatermark(String text, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f);g2d.setComposite(alphaChannel);g2d.setColor(Color.LIGHT_GRAY);g2d.setFont(new Font("Arial", Font.BOLD, 40));FontMetrics fontMetrics = g2d.getFontMetrics();int textWidth = fontMetrics.stringWidth(text);int textHeight = fontMetrics.getHeight();// 循环绘制水印文本,覆盖整个图像for (int x = 0; x < sourceImage.getWidth(); x += textWidth + 20) {for (int y = textHeight; y < sourceImage.getHeight(); y += textHeight + 20) {g2d.drawString(text, x, y);}}ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Tiled text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

在这个例子中,我们通过两个嵌套的 for 循环,将水印文本平铺到整个图像上。每次绘制文本时,我们根据文本的宽度和高度调整绘制坐标,以确保文本不重叠。

6.2 平铺图像水印

接下来,我们来看如何实现平铺图像水印:

public static void addTiledImageWatermark(File watermarkImageFile, File sourceImageFile, File destImageFile) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f);g2d.setComposite(alphaChannel);// 循环绘制水印图像,覆盖整个图像for (int x = 0; x < sourceImage.getWidth(); x += watermarkImage.getWidth() + 20) {for (int y = 0; y < sourceImage.getHeight(); y += watermarkImage.getHeight() + 20) {g2d.drawImage(watermarkImage, x, y, null);}}ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Tiled image watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}
}

与平铺文本水印类似,我们通过两个嵌套的 for 循环,将水印图像平铺到整个图像上。可以调整循环的步长以改变水印图像之间的间距。

7. 综合示例:创建一个水印工具类

为了便于重复使用,我们可以将上述不同类型的水印方法封装到一个工具类中。这样可以更方便地在不同项目中应用水印功能。

public class WatermarkUtils {public static void addTextWatermark(String text, File sourceImageFile, File destImageFile, float opacity, Color color, Font font, int x, int y) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);g2d.setComposite(alphaChannel);g2d.setColor(color);g2d.setFont(font);g2d.drawString(text, x, y);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}}public static void addImageWatermark(File watermarkImageFile, File sourceImageFile, File destImageFile, float opacity, int x, int y) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);g2d.setComposite(alphaChannel);g2d.drawImage(watermarkImage, x, y, null);ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Image watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}}public static void addTiledTextWatermark(String text, File sourceImageFile, File destImageFile, float opacity, Color color, Font font, int xStep, int yStep) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);g2d.setComposite(alphaChannel);g2d.setColor(color);g2d.setFont(font);FontMetrics fontMetrics = g2d.getFontMetrics();int textWidth = fontMetrics.stringWidth(text);int textHeight = fontMetrics.getHeight();for (int x = 0; x < sourceImage.getWidth(); x += textWidth + xStep) {for (int y = textHeight; y < sourceImage.getHeight(); y += textHeight + yStep) {g2d.drawString(text, x, y);}}ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Tiled text watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}}public static void addTiledImageWatermark(File watermarkImageFile, File sourceImageFile, File destImageFile, float opacity, int xStep, int yStep) {try {BufferedImage sourceImage = ImageIO.read(sourceImageFile);BufferedImage watermarkImage = ImageIO.read(watermarkImageFile);Graphics2D g2d = (Graphics2D) sourceImage.getGraphics();AlphaComposite alphaChannel = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity);g2d.setComposite(alphaChannel);for (int x = 0; x < sourceImage.getWidth(); x += watermarkImage.getWidth() + xStep) {for (int y = 0; y < sourceImage.getHeight(); y += watermarkImage.getHeight() + yStep) {g2d.drawImage(watermarkImage, x, y, null);}}ImageIO.write(sourceImage, "png", destImageFile);g2d.dispose();System.out.println("Tiled image watermark added successfully.");} catch (Exception ex) {ex.printStackTrace();}}
}

此工具类提供了多种水印选项,包括文本水印、图像水印、平铺文本水印和平铺图像水印。用户可以根据需求选择适合的水印类型,并设置透明度、颜色、字体和位置等参数。

通过以上示例代码,你可以轻松实现 Java 图像处理中的水印功能。希望这些代码示例对你有所帮助,祝你在图像处理项目中取得成功!

这篇关于使用 Java 为图片添加各种样式的水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1143155

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.