import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageUtil {
/**
* 給圖片添加水印
* @param originImgPath 原始圖片的路徑
* @param targetImgPath 添加水印后圖片的保存路徑
* @param markImgPath 水印的路徑
* @param mode 內部枚舉類,用於指定水印鋪設的樣式,平鋪,拉伸等
* @param margin_x 水印之間的水平間距
* @param margin_y 水印之間的垂直間距
* @param opacity 水印透明度
* @param markAngle 水印旋轉角度,應在正負45度之間
* @throws IOException
*/
public static void markImage(String originImgPath,String targetImgPath,String markImgPath,int mode,int margin_x,int margin_y,float opacity,double markAngle) throws IOException {
if(markAngle>45||markAngle<-45){
throw new RuntimeException("旋轉角度必須在正負45度之間。");
}
BufferedImage originImg= ImageIO.read(new File(originImgPath));
BufferedImage markImage = ImageIO.read(new File(markImgPath));
Graphics2D graphics = (Graphics2D) originImg.getGraphics();
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, opacity));
graphics.rotate(markAngle);
if(mode == PAINT_MODE.TILED.mode){
int canvasHeight = originImg.getHeight();
int canvasWidth = originImg.getWidth();
int markHeight = markImage.getHeight();
int markWidth = markImage.getHeight();
int interval = markWidth+markHeight;
for(int i=-canvasHeight;i<canvasWidth+canvasHeight;i=i+interval+margin_x){
for(int j=-canvasWidth;j<canvasHeight+canvasWidth;j=j+interval+margin_y){
graphics.drawImage(markImage,i,j,markImage.getWidth(),markImage.getHeight(),null);
}
}
}
graphics.dispose();
ImageIO.write(originImg,"png",new File(targetImgPath));
}
//內部枚舉類
enum PAINT_MODE{
REGULAR(0),//常規
TILED(1),//平鋪
STRETCHED(2);//拉伸
private int mode;
PAINT_MODE(int mode){
this.mode = mode;
}
}
//測試main方法
public static void main(String[] args) {
try {
markImage("D:/source.png","D:/target.png","D:/mark.png",PAINT_MODE.TILED.mode,50,50,0.5f,-45);
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果圖:
issue:1.只貼了平鋪樣式,拉伸只需要將水印圖片的長寬設置為和源圖片一樣大。常規樣式只需不循環遍歷即可。
2.旋轉有一定的空間浪費,我本想通過三角函數計算旋轉特定角度后循環的起止X,y軸位置,但是計算結果應用后並不能達到預期效果,只好給一個較大的定值。
3.添加文字水印更為簡單,只需調用graphics2D的drawString方法,並設置字體和顏色即可。希望有需求的朋友多多動手。
