java之批量给某目录下指定的图片格式添加水印文字效果
public static void main(String[] args) throws Exception {
//调用方法 参数1是原目录图片 参数2是目标目录
allwaterimg(new File("F:/download/壁纸"), new File("F:/beg"));
}
public static void allwaterimg(File src, File dst) throws Exception {
//判断原目录文件的类型是不是文件或者目录格式,如果是文件,则继续判断是不是jpg类型
if (src.isFile() && src.getName().endsWith(".jpg")) {
//是文件且是jpg格式类型,则调用waterimg方法
waterimg(src, dst);
}
else if (src.isDirectory()) {
for (File ff : src.listFiles()) {
if (!dst.exists()) {
dst.mkdirs();
}
//如果文件是目录,则进行递归
if (ff.isDirectory()) {
//进行递归处理并新建目录
allwaterimg(ff, new File(dst + "/" + ff.getName()));
}
//是文件,进行判断是否是jpg格式,是就调用waterimg方法
else if (ff.isFile() && ff.getName().endsWith(".jpg")) {
waterimg(ff, new File(dst, ff.getName()));
}
}
}
}
public static void waterimg(File src, File dst) throws Exception {
//获取原文件
BufferedImage img = ImageIO.read(src);
//获取原图片的宽和高
int iw = img.getWidth();
int ig = img.getHeight();
//画笔
Graphics2D g = img.createGraphics();
//设置线条和文件的,抗锯齿(平滑)
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
//设置水印文字
String txt = "版权所有 禁止复制";
txt = String.format("%tF %<tT", System.currentTimeMillis());
//设置水印文字类型,这里也可以使用系统自带的文字类型
var font = Font.createFont(Font.TRUETYPE_FONT, new File("fonts/FZZYJW.TTF")).deriveFont(Font.BOLD, 100f);
//画笔获得文字类型
g.setFont(font);
Random rand = new Random();
//随机字体的颜色以及透明度
Color color = new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
g.setColor(color);
//获取字体大小
FontMetrics fm = g.getFontMetrics(font);
int ascent = fm.getAscent();
int fw = fm.stringWidth(txt);
//左上角打上水印
int tx = 0 + 10;
int ty = ascent + 10;
/* //左下角打上水印
tx = 0 + 10;
ty = ig - 15;
//右上角打上水印
tx = iw - fw - 10;
ty = ascent + 10;
//右下角打上水印
tx = iw - fw - 10;
ty = ig - 15;
//中间打上水印
tx = (iw - fw) / 2;
ty = (ig - ascent) / 2 + ascent;*/
//随机位置打上水印
tx = rand.nextInt(10, iw - fw - 10);
ty = rand.nextInt(ascent + 10, ig - 5 - 10);
g.drawString(txt, tx, ty);
//释放画笔
g.dispose();
ImageIO.write(img, "jpg", new File(dst.getParent(),UUID.randomUUID()+".jpg"));
}