程序中提供两个方法,一个使用一个透明的GIF文件(mark.gif)为图片加水印,另一个将一个字符串作为水印加入图片中,两个方法均可设置透明度,并能设置倾斜角度。
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import javax.imageio.ImageIO;
public class PressWaterMark {
/**
* @param srcFile
* 要加水印的源文件
* @param waterMarkFile
* 水印文件,为保证质量,最好使用Gif格式,背景设为透明
* @param alpha
* 透明度,0~1之间,0透明,1不透明
* @param degree
* 水印旋转角度
* @throws Exception
* 使用一个水印文件为源文件加上水印,水印铺满全部图片
*/
public final static void pressImage(File srcFile, File waterMarkFile,
float alpha, double degree) throws Exception {
// 加载目标图片
Image srcImg = ImageIO.read(srcFile);
int src_width = srcImg.getWidth(null);
int src_height = srcImg.getHeight(null);
// 将图片加载到内存
BufferedImage bufImg = new BufferedImage(src_width, src_height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, src_width, src_height, null);
// 加载水印图片
Image waterMarkImage = ImageIO.read(waterMarkFile);
int w_width = waterMarkImage.getWidth(null);
int w_height = waterMarkImage.getHeight(null);
// 设置透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
g.rotate(-Math.PI / 180 * degree, (double) bufImg.getWidth() / 2,
(double) bufImg.getHeight() / 2);
// 设置水印图片位置
for (int x = 0; x < src_width; x += 3 * w_width)
for (int y = 0; y < src_height; y += 3 * w_height)
// 将水印图片“画”在目标图片的指定位置
g.drawImage(waterMarkImage, x, y, w_width, w_height, null);
g.dispose();
ImageIO.write(bufImg, "JPG", srcFile);
}
/**
* @param waterText
* 水印字符串
* @param font
* 字符串字体
* @param alpha
* 透明度,0~1之间,0透明,1不透明
* @param degree
* 字符串旋转角度
* @throws Exception
* ImageIO读取失败时,抛出异常
*/
public static void pressText(File scrFile, String waterText, Font font,
float alpha, double degree) throws Exception {
// 加载目标图片
Image srcImg = ImageIO.read(scrFile);
int src_width = srcImg.getWidth(null);
int src_height = srcImg.getHeight(null);
// 将目标图片加载到内存
BufferedImage bufImg = new BufferedImage(src_width, src_height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufImg.createGraphics();
g.drawImage(srcImg, 0, 0, src_width, src_height, null);
// 设置水印文字透明度
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
alpha));
g.rotate(-Math.PI / 180 * degree, (double) bufImg.getWidth() / 2,
(double) bufImg.getHeight() / 2);
g.setFont(font);
g.setColor(Color.CYAN);
// 设置水印文字的位置
int t_width = font.getSize() * waterText.length();
int t_height = font.getSize();
// 写水印文字
for (int x = 0; x < src_width; x += t_width + 150)
for (int y = 0; y < src_height; y += 3 * t_height)
// 将水印图片“画”在目标图片的指定位置
g.drawString(waterText, x, y);
g.dispose();
// 保存目标图片
ImageIO.write(bufImg, "JPG", scrFile);
}
public static void main(String args[]) throws Exception {
File f = new File("d:/ccc");
File imgFiles[] = f.listFiles(new ImageFilter());
for (File x : imgFiles) {
System.out.println(x.getName() + "正在加水印...");
pressImage(x, new File("d:/ccc/mark.gif"), 0.2f, 10);
}
System.out.println("谢谢使用!");
}
}