java 批量爲圖片添加圖標水印和文字水印

需求,給指定目錄下面以.jpg結尾的文件,添加圖標水印和文字水印

package com.gblfy.util;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * java爲圖片添加圖標水印和文字水印
 *
 * @author gblfy
 * @version 1.0
 * @explain 文字水印、圖片水印
 * @creationTime 2020/07/01
 */
public class WaterMarkUtil {

    //水印圖片路徑
    private static String WATER_MARKIMG_PATH = "D:" + File.separator + "1" + File.separator + "iconPath" + File.separator + "22.png";
    //當前登陸操作員 採用全局變量
    private static String operator;

    static {
         operator = "zhangsan";
    }

    /**
     * 將指定圖標(png圖片)印刷到指定圖片上
     * <p>
     *  1.圖標圖片格式:
     *    png
     *  2.座標軸:
     *    x軸決定左右位置
     *    y軸決定上下位置
     * 3.座標位置
     *   x值越大距離右越近,反之,x值越小距離左越近;
     *   y值越大距離越往下,反之,y值越小距離越往上
     * </p>
     *
     * @param pressImg  水印圖片
     * @param targetImg 源圖片路徑的目標文件
     * @param x         x座標
     * @param y         y座標
     */
    public final static void pressImage(String pressImg, String targetImg, int x, int y) {
        try {
            // 目標文件
            File imageFile = new File(targetImg);
            Image src = ImageIO.read(imageFile);

            int wideth = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            g.drawImage(src, 0, 0, wideth, height, null);

            // 水印文件
            File waterMarkImage = new File(pressImg);
            Image markImage = ImageIO.read(waterMarkImage);
            int weightMarkImage = markImage.getWidth(null);
            int heightMarkImage = markImage.getHeight(null);

            g.drawImage(markImage, x, y, weightMarkImage, heightMarkImage, null);

            // 水印結束
            g.dispose();
            FileOutputStream out = new FileOutputStream(targetImg);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打印文字水印圖片
     * <p>
     * 1.圖標圖片格式:png
     * 2.座標軸:
     *   x軸決定左右位置
     *   y軸決定上下位置
     * 3.座標位置
     *   x值越大距離右越近,反之,x值越小距離左越近;
     *   y值越大距離越往下,反之,y值越小距離越往上
     * </p>
     *
     * @param pressText 文字
     * @param targetImg 目標圖片
     * @param fontName  字體名
     * @param fontStyle 字體樣式
     * @param color     字體顏色
     * @param fontSize  字體大小
     * @param x         偏移量
     * @param y         偏移量
     */
    public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, Color color,
                                 int fontSize, int x, int y) {
        try {
            File imageFile = new File(targetImg);
            Image src = ImageIO.read(imageFile);
            int weidth = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(weidth, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            g.drawImage(src, 0, 0, weidth, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName, fontStyle, fontSize));
            g.drawString(pressText, x, y);
            g.dispose();
            FileOutputStream out = new FileOutputStream(targetImg);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 添加圖標水印+文字水印
     *
     * @param srcImgPath 需要處理的源圖片路徑
     */
    public static void iconAndTextWatermark(String srcImgPath) {
        // 1.添加圖標水印
        pressImage(WATER_MARKIMG_PATH, srcImgPath, 100, 500);
        System.out.println("--------------------添加圖標水印 執行完成!--------------------");

        String date = TimeUtil.getCurrentDate().toString();
        String time = TimeUtil.getCurrentTime().toString();

        // 2.添加文字水印  參數根據真實保單圖片進行調整
        pressText(operator, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 600);
        pressText(date, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 650);
        pressText(time, srcImgPath, "宋體", 0, Color.BLUE, 30, 540, 700);

        System.out.println("--------------------添加文字水印 執行完成!--------------------");
    }

    /**
     * 對.jpg圖片文件進行篩選
     * <p>
     *   1.使用遞歸遍歷目錄下面的.jpg結尾圖片文件
     *   2.對篩選通過的文件調用水印文件處理
     * </p>
     *
     * @param path
     * @return
     */
    public static void getFileListNotReturn(String path) {

        File dir = new File(path);
        // 該文件目錄下文件全部放入數組
        File[] files = dir.listFiles();
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                String fileName = files[i].getName();
                // 判斷是文件還是文件夾
                if (files[i].isDirectory()) {
                    // 獲取文件絕對路徑
                    getFileListNotReturn(files[i].getAbsolutePath());
                    // 判斷文件名是否以.jpg結尾
                } else if (fileName.endsWith(".jpg")) {
                    String strFileName = files[i].getAbsolutePath();
                    System.out.println("文件名:" + strFileName);
                    //對符合條件的文件統一水印處理
                    iconAndTextWatermark(strFileName);
                } else {
                    continue;
                }
            }
        }
    }
    //--------------------------------------------單元測試--------------------------------------------
    public static void main(String[] args) {
        String srcImgPath = "D:\\1\\srcImgPath\\";
        System.out.println("圖片路徑:" + srcImgPath);
        getFileListNotReturn(srcImgPath);
    }

    /**
     *  特別說明:
     *  如上面的效果展示的那樣,要想將水印打印到圖片指定位置,進行動態設置的話,需要:</p>
     *  第一,原圖片大小;</p>
     *  第二,水印大小;</p>
     *  滿足這兩個條件才能將水印打印到圖片的指定位置,也就是可以進行動態位移。&nbsp;</p>
     *  其中,圖片水印可以進行動態設置,而文字水印則實現不了,因爲我們無法獲取文字水印的大小。</p>
     *  調試水印輸出位置也是個細緻活呀。</p>
     * 另外,水印的偏移量一般情況下均爲正值,圖片左上角爲起點0,0,不同於數學上的Y軸,向下偏移用正值表示。
     */
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章