java給圖片添加圖片水印,設置樣式平鋪,拉伸


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方法,並設置字體和顏色即可。希望有需求的朋友多多動手。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM