贴一段 最近写的用来 给 给定目录下的图片 添加水印的代码。
WaterMark.java:
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.sun.image.codec.jpeg.JPEGCodec;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.FilenameFilter;
import java.io.FileOutputStream;
import java.util.Properties;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
public class WaterMark {
private List<File> filterFiles(String path, FilenameFilter filter, List<File> fileList) {
if (new File(path).exists() && new File(path).isDirectory()) {
File[] files = new File(path).listFiles(filter);
fileList.addAll(Arrays.asList(files));
File[] allFiles = new File(path).listFiles();
for (File file : allFiles) {
if (file.isDirectory())
filterFiles(file.getPath(), filter, fileList);
}
}
return fileList;
}
private void drawWaterMark(File srcPicture, File logoPicture, String destPath, float logoPercent) {
try {
Image src = ImageIO.read(srcPicture);
int width = src.getWidth(null);
int height = src.getHeight(null);
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.createGraphics();
g.drawImage(src, 0, 0, width, height, null);
Image src_logo = ImageIO.read(logoPicture);
int width_src_logo = src_logo.getWidth(null);
int heigth_src_logo = src_logo.getHeight(null);
int width_logo = (int) (width * logoPercent);
int height_logo = heigth_src_logo * width_logo / width_src_logo;
g.drawImage(src_logo, (width - width_logo) / 2, (height - height_logo) / 2,
width_logo, height_logo, null);
g.dispose();
FileOutputStream out = new FileOutputStream(destPath + "\\" + srcPicture.getName());
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void draw() {
try {
Properties props = new Properties();
props.load(WaterMark.class.getClassLoader().getResourceAsStream("system.properties"));
FFilter filter = new FFilter(props.getProperty("extensions.pictures"));
List<File> files = new ArrayList<File>();
String srcPath = props.getProperty("path.pictures.src");
files = filterFiles(srcPath, filter, files);
File logoPic = new File(props.getProperty("path.picture.logo"));
String destPath = props.getProperty("path.pictures.dest");
float logoSize = Float.valueOf(props.getProperty("percent.picture.logo"));
for (File pic : files) {
String path = pic.getPath().substring(srcPath.length());
path = path.substring(0, path.indexOf(pic.getName()));
String newPath = destPath + path;
if (!new File(newPath).exists())
new File(newPath).mkdirs();
drawWaterMark(pic, logoPic, newPath, logoSize);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new WaterMark().draw();
}
}
FFilter.java :
import java.io.FilenameFilter;
import java.io.File;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class FFilter implements FilenameFilter {
private String regEx = "";
public FFilter(String regEx) {
this.regEx = regEx;
}
public boolean accept(File dir, String filename) {
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(filename);
return m.find();
}
}
system.properties:
#source pictures directory
path.pictures.src=C:\\Documents and Settings\\Lexy\\Desktop\\testPic
#destination pictures directory
path.pictures.dest=C:\\Documents and Settings\\Lexy\\Desktop\\destTestPicDest
#picture's extensions,space by "|"
extensions.pictures=.jpg
#path of the watermark logo
path.picture.logo=C:\\Documents and Settings\\Lexy\\Desktop\\logo.png
#the watermark percent of the pictures
percent.picture.logo=0.5