前言
创作Idea来源
随着各种网络添加水印工具层出不穷,比如 改图宝,I love IMG等,其操作都是
- 进入网站,从本地电脑里面选取一张或者多张图片文件,
- 输入自己想要的水印文字,调整水印的格式以及位置,
- 点击下载,然后自己在去本地文件夹里面去找。 基于这些步骤所以笔者在想,大家都是这样的步骤,那么能不能提高我们自己的效率,让我们在本地就可以傻瓜式的输入自己的水印文字,然后我们只需要鼠标双击之后,程序就能够完成上述的重复操作,增加我们使用的使用效率呢,所以,笔者写了简单的一个本地批量水印图片(可以拓展成any 文件)添加工具,减少平常使用过程中的重复劳动
一、使用JDK自带的Graphics2D来绘制水印
在Java 中可以使用JDK自带的 Graphics2D 类来绘制水印。可以添加图片水印或者文字水印。
1.使用步骤
// 构造一个BufferedImage对象,width和height分别是图片的宽度和高度,
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
注:BufferedImage.TYPE_INT_BGR 是 Java 中用于表示图像的一种数据类型。它表示每个像素使用32位(4字节)来表示,其中24位用于表示RGB颜色(8位表示蓝色,8位表示绿色,8位表示红色),另外8位用于表示alpha通道(即像素的透明度)。这种类型的图像不包含任何alpha通道数据,所以颜色值直接映射到0-255之间。这种类型常用于需要处理大量图片数据的情况,因为它可以有效地存储和处理图片数据。同时,由于它直接使用RGB颜色模型,所以它也适用于需要直接操作像素颜色的应用。
//构造一个 Graphics2D 对象
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(targetImg, 0, 0, width, height, null);
注:g.drawImage(targetImg, 0, 0, width, height, null); 这行代码的意思是:使用 targetImg 图像作为源图像,将其绘制到 bufferedImage 上。绘制的起始位置是 (0, 0),绘制的宽度为 width,绘制的的高度为 height。null 是 ImageObserver 参数,表示图像绘制完成后立即通知所有注册的图像观察者
设置水印
g.setColor(textColor); //水印颜色
//设置水印的字体,格式,以及字体大小
g.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));
// 水印内容放置在右下角
int x = width - (int)((text.length() - 2)) * fontSize - fontSize * 2;
int y = height- fontSize * 2;
// 设置水印透明度
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g.setComposite(alphaComposite);
//绘制水印
g.drawString(text, x, y);
2.完整方法代码示例
package softwareTest;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
public class WatermarkExample {
public static void main(String[] args) throws IOException {
String currentDirectory = System.getProperty("user.dir");
System.out.println(currentDirectory);
File file = new File("你的要绘制图片的原文件的路径");
BufferedImage image = ImageIO.read(file);
addTextWaterMark(image, Color.BLACK, 45, "by 苏雨只会喵喵", "你的生成水印后的文件路径",0.2f);//0.2f表示的是水印的透明度
}
public static void addTextWaterMark(BufferedImage targetImg, Color textColor, int fontSize, String text, String outPath,float alpha) {
try {
//图片宽
int width = targetImg.getWidth();
//图片高
int height = targetImg.getHeight();
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(targetImg, 0, 0, width, height, null);
g.setColor(textColor); //水印颜色
g.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));
// 水印内容放置在右下角
// int x = width - (text.length() - 1) * fontSize;
int x = width - (int)((text.length() - 2)) * fontSize - fontSize * 2;
int y = height- fontSize * 2;
// 设置水印透明度
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g.setComposite(alphaComposite);
g.drawString(text, x, y);
FileOutputStream outImgStream = new FileOutputStream(outPath);
// 这里的“jpg”,笔者更多的理解为是一个形式参数,最后生成的效果图的图片格式跟这个jpg没有太多的关系
ImageIO.write(bufferedImage, "jpg", outImgStream);
outImgStream.flush();
outImgStream.close();
g.dispose();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3.效果示例
原图片:
效果图:
以上我们实现了对于单个图片的水印的添加,有了这个基础,我们就可以进行下面的一键批量添加的的程序编写,一起来随笔者往下看看吧
二、使用File类来进行批量图片的水印添加
前言:读者一直想要获得当前文件夹的路径,查阅资料得知当前文件夹的路径编写应该是”.“,但是程序运行的时候,打印的结果却是依旧是一个点,这个和我的预期结果不符合,但是获取相对路径的方式没有问题,那为什么和我的预期结果不符合呢,我思考未果,决定去将程序打包成jar包之后再去运行,终于,过啦,和自己的预期结果相符,虽然的最后结果依旧带有”.“,但是无伤大雅,我我们可以使用Java里面String来来进行修改
1.思路概述
1. 首先我们先获得当前文件目录,然后遍历当前文件目录里面的文件
2. 对于满足我们图片格式的图片,我们把对应的路径提取出来,然后存放在list集合里面方便后续的操作
3. 新建一个文件夹用于保存我们的水印生成的图片,即就是在当前路径的基础上新建一个目录(后续的代码会给出
4. 遍历我们的list集合,给当前路径下的每个文件增加水印,然后保存在我们新建的目录下
2.代码实现
package softwareTest;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author suyu
* @date 2023/11/10 22:14
* @description 小工具,给当前目录下的所有图片添加水印之后将生成的文件放在另一个新建的文件里面
*/
public class MyToolWaterMarkImpl{
public static void main(String[] args) throws IOException {
System.out.println(" _ __ __ _ \n" +
" | | | \\/ | | | \n" +
" ___ _ _ _ _ _ _ __ __ __ _ | |_ ___ _ __ | \\ / | __ _ _ __ | | __\n" +
" / __|| | | || | | || | | | \\ \\ /\\ / // _` || __|/ _ \\| '__|| |\\/| | / _` || '__|| |/ /\n" +
" \\__ \\| |_| || |_| || |_| | \\ V V /| (_| || |_| __/| | | | | || (_| || | | < \n" +
" |___/ \\__,_| \\__, | \\__,_| \\_/\\_/ \\__,_| \\__|\\___||_| |_| |_| \\__,_||_| |_|\\_\\\n" +
" __/ | ______ ______ \n" +
" |___/ |______||______| ");
System.out.println("作者:苏雨只会喵喵");
System.out.println("主页:suyu2748.top");
List<String> list = new ArrayList<String>();
List<String> singleList = new ArrayList<String>();
//得到当前的目录
File folder = new File(".");
//得到当前目录的绝对路径
String absolutFile = folder.getAbsolutePath();
absolutFile = absolutFile.substring(0, absolutFile.length() - 1);
System.out.println(absolutFile);//当前目录的绝对路径
System.out.println(folder);//.
// 获取当前目录下所有的满足以下格式的图片文件(这里可以拓展
File[] pngFiles = folder.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".png") || name.endsWith(".jpg") || name.endsWith("jpeg")
|| name.endsWith("webp") || name.endsWith("gif");
}
});
// 打印每个文件的名字,把当前路径拼接该目录下面的文件名字
String filePath = null;
for (File file : pngFiles) {
filePath = file.getPath().substring(2);
System.out.println(filePath);
list.add(absolutFile + filePath);
singleList.add(filePath);
System.out.println(absolutFile + filePath);
}
//markedFile就是你存放水印图片的那个目录
String markedFile = "markedFile";
//在当前文件目录下新建一个目录
File newFile = new File(absolutFile + "\\" + markedFile);
if (!newFile.exists()) {
newFile.mkdirs();//创建目录
}
System.out.println(newFile.getPath());
System.out.println(singleList);
//这个list里面存放的是原来的文件的路径
File tempFile = null;
BufferedImage image = null;
for (int i = 0; i < list.size(); i++) {
tempFile = new File(list.get(i));
image = ImageIO.read(tempFile);
//这里就直接调用的是我们第一步写的那个方法即可
WatermarkExample.addTextWaterMark(image, Color.BLACK, 45, args[0], newFile.getPath() + "\\" + singleList.get(i), 0.2f);
}
}
}
3.编写bat脚本,懒人运行的必备神器
@echo off
echo "_ __ __ _"
echo "| | | \/ | | |"
echo " ___ _ _ _ _ _ _ __ __ __ _ | |_ ___ _ __ | \ / | __ _ _ __ | | __"
echo " / __|| | | || | | || | | | \ \ /\ / // _` || __|/ _ \| '__|| |\/| | / _` || '__|| |/ /"
echo " \__ \| |_| || |_| || |_| | \ V V /| (_| || |_| __/| | | | | || (_| || | | <"
echo " |___/ \__,_| \__, | \__,_| \_/\_/ \__,_| \__|\___||_| |_| |_| \__,_||_| |_|\_\"
echo " __/ | ______ ______ "
echo " |___/ |______||______|"
echo 作者:苏雨只会喵喵
echo 主页:suyu2748.top
set /p user_input=请输入你想要添加的水印文字:
echo 您输入的水印文字是:%user_input%
java -cp waterMark.jar softwareTest.Test %user_input%
echo 水印操作已完成
pause
总结
这个批量水印添加工具不难,但是笔者在编写的过程中对File类和Graphics2D类的不熟悉让笔者走了不少弯路,查阅了不少资料,加上后续的优化,最后的效果就是,笔者双击bat文件之后,只需要输入你想要添加的水印文字,回车即可,本文创作不易,希望能帮助到各位uu们哦!!!