编程语言
首页 > 编程语言> > Java为图片加水印

Java为图片加水印

作者:互联网

Java为图片加水印工具类

一、简介

二、效果图

三、基本参数

// +++++++++++++++ 配置参数 +++++++++++++++++++

/** 文字水印内容 */
private String fontText = null;
/** 图片水印内容 */
private String imgText = null;
/** 操作的图片文件 */
private String filePath = null;


// +++++++++++++ 初始化一些参数 +++++++++++++++++

/** 图片宽度 */
private int width;
/** 图片高度 */
private int height;
/** 画笔操作 */
private Graphics2D graphics2D = null;
/** 图片缓冲区 */
private BufferedImage bufferedImage = null;


// +++++++++++++ 自定义的水印参数 ++++++++++++++

/** 文字字体 */
private String fontName  = null;
/** 文字样式 */
private int fontStyle;
/** 文字大小 */
private int fontSize;
/** 文字颜色 */
private Color fontColor;
/** 透明度 */
private float alpha;
/** 外框宽度 */
private int borderWidth;
/** 旋转高度 */
private double angdeg;
/** 间距 */
private int spacing;
/** 最后图片保存路径 */
private String savePath = null;

四、工具方法

水印位置
public static enum Position{
    /** 上左 */
    TOP_LEFT(1),
    /** 上右 */
    TOP_RIGHT(2),
    /** 下左 */
    BOTTOM_LEFT(3),
    /** 下右 */
    BOTTOM_RIGHT(4)
        ;
    public int type;

    Position(int type) {
        this.type = type;
    }

    public int getType() {
        return type;
    }
}
设置文字或者图片水印位置
/**
  * @function              设置文字或者图片水印位置
  * @param position        添加水印的位置
  * @param waterWidth      添加水印的宽度
  * @param waterHeight     添加水印的高度
  * @param type            true:文字,false:图片
  * @return                int[]  x, y
  */
private int[] setPosition (int position, int waterWidth, int waterHeight, boolean type) {
    int x = width - waterWidth;
    int y = height - waterHeight;
    switch (position) {
        case 1:
            x = type ? borderWidth : 0;
            y = type ? borderWidth : 0;
            break;
        case 2:
            y = type ? borderWidth : 0;
            break;
        case 3:
            x = type ? borderWidth : 0;
            y = type ? y - borderWidth : y;
            break;
        case 4:
        default:
            x = type ? x - borderWidth : x;
            y = type ? y - borderWidth : y;
            break;
    }
    return new int[]{x, y};
}
初始化参数

初始化BufferImageGraphisc2D和目标图片的宽和高。

/**
  * 初始化参数
  */
private void init () {
    try {
        // 获取图片示例,并获取图片的高度,宽度
        Image img = ImageIO.read(new File(filePath));
        width = img.getWidth(null);
        height = img.getHeight(null);
        // 创建图片缓冲区
        bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        // 创建绘图工具
        graphics2D = bufferedImage.createGraphics();
        // 将原图放到缓冲区
        graphics2D.drawImage(img, 0, 0, width, height, null);
    } catch (IOException e) {
        System.out.println("文件读写异常");
        e.printStackTrace();
    }
}
将操作之后的图片存在磁盘

如何没有填写保存路径,将会将原图片覆盖。

/**
  * 将图片保存到磁盘
  */
private void save () {
    String path = null;
    if ((savePath == null) || (savePath.equals(""))) {
        path = filePath;
    } else {
        path = savePath;
    }
    // 将缓冲区图片放到磁盘上
    try (FileOutputStream os = new FileOutputStream(path)) {
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
        encoder.encode((bufferedImage));
    } catch (IOException e) {
        System.out.println("文件读写异常");
        e.printStackTrace();
    }
}
设置文字水印的宽和高

对于中英文字符宽度不一样,所以要对中英文进行不同的处理。

/**
  * 获取文字位置
  * @param text
  * @return
  */
private int getTextLength (String text) {
    int len = text.length();
    for (int i = 0; i < text.length(); i++) {
        String s = String.valueOf(text.charAt(i));
        if (s.getBytes().length > 1) {
            len ++;
        }
    }
    return len % 2 == 0 ? len / 2 : len / 2 + 1;
}
添加单个文字水印
/**
  * 添加单个文字水印
  * @throws IOException
  * @param place
  */
public void addFontWater(Position place) {
    init();
    // 创建文字水印的样式
    graphics2D.setFont(new Font(fontName, fontStyle, fontSize));
    // 文字颜色
    graphics2D.setColor(fontColor);
    // 获取文字位置x,y坐标
    int type = place.getType();
    int[] position = setPosition(type, fontSize * getTextLength(fontText), fontSize, true);
    int x = position[0];
    int y = position[1] + fontSize;
    // 将文字写入指定位置,并关闭画笔资源
    graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
    graphics2D.drawString(fontText, x, y);
    graphics2D.dispose();
    save();
}
创建那个操作句柄
public static Builder create = new ImageWaterTool.Builder();
建造者模式设置属性

因为部分属性是默认,但是有些默认的属性是可以使用者自定义的,所以使用建造者进行对象属性构建是最好的。

public class ImageWaterTool {

    // ++++++++ 配置参数 ++++++++++++++++
    /** 文字水印内容 */
    private String fontText = null;
    /** 图片水印内容 */
    private String imgText = null;
    /** 操作的图片文件 */
    private String filePath = null;
    // .....

    public ImageWaterTool(Builder builder) {
        this.fontText = builder.fontText;
        this.imgText = builder.imgText;
        this.filePath = builder.filePath;
           // ....
    }

    public static class Builder {

        // +++++++++++ 配置参数 +++++++++++++++
        /** 文字水印内容 */
        private String fontText = null;
        /** 图片水印内容 */
        private String imgText = null;
        /** 操作的图片文件 */
        private String filePath = null;
        // .....
        

        public Builder setFontText(String fontText) {
            this.fontText = fontText;
            return this;
        }

        public Builder setImgText(String imgText) {
            this.imgText = imgText;
            return this;
        }

        public Builder setFilePath(String filePath) {
            this.filePath = filePath;
            return this;
        }

        // ....
    }

    public static enum Position{
        // ....
    }

    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    /**
     * @function              设置文字或者图片水印位置
     * @param position    添加水印的位置
     * @param waterWidth      添加水印的宽度
     * @param waterHeight     添加水印的高度
     * @param type            true:文字  ——  false:图片
     * @return                int[]  x, y
     */
    private int[] setPosition (int position, int waterWidth, int waterHeight, boolean type) {
        // ....
    }

    /**
     * 初始化参数
     */
    private void init () {
        // ....
    }

    /**
     * 将图片保存到磁盘
     */
    private void save () {
        // ....
    }

    /**
     * 获取文字位置
     * @param text
     * @return
     */
    private int getTextLength (String text) {
        // ....
    }

    /**
     * 添加单个文字水印
     * @throws IOException
     * @param place
     */
    public void addFontWater(Position place) {
        // ....
    }

    /**
     * 添加单个图片水印
     * @throws IOException
     */
    public void addPicWater (Position place) throws IOException {
        // ....
    }

    /**
     * 添加多个文字水印
     * @throws IOException
     */
    public void addManyFontWater () {
        // ....
    }

    /**
     * 添加多个图片水印
     * @throws IOException
     */
    public void addManyPicWater () throws IOException {
        // ....
    }

    public static Builder create = new ImageWaterTool.Builder();

    public static void main(String[] args) throws Exception {
        ImageWaterTool.create
                .setFilePath("C:\\Users\\long\\Desktop\\test-1.png")
                .setFontText("https://blog.csdn.net/yhflyl")
                .setFontSize(30)
                .build()
                .addFontWater(Position.BOTTOM_RIGHT);
    }
}
使用
public static void main(String[] args) throws Exception {
    ImageWaterTool.create
        // 本地文件路径
        .setFilePath("C:\\Users\\long\\Desktop\\test-1.png")
        // 添加的文字水印
        .setFontText("https://blog.csdn.net/yhflyl")
        // 文字大小
        .setFontSize(30)
        .build()
        .addFontWater(Position.BOTTOM_RIGHT);
}

五、完整代码

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;

/**
 * @author 墨龙吟
 * @version 1.0.0
 * @ClassName ImageWaterUtil.java
 * @Email 2354713722@qq.com
 * @Description TODO   文件添加水印
 * @createTime 2019年09月09日 - 23:32
 */
public class ImageWaterTool {

    // ++++++++++++++++++++++++++ 配置参数 +++++++++++++++++++++++++++++++++++++++++++++++++++
    /** 文字水印内容 */
    private String fontText = null;
    /** 图片水印内容 */
    private String imgText = null;
    /** 操作的图片文件 */
    private String filePath = null;

    // ++++++++++++++++++++++++++ 初始化一些参数 ++++++++++++++++++++++++++++++++++++++++++++++
    /** 图片宽度 */
    private int width;
    /** 图片高度 */
    private int height;
    /** 画笔操作 */
    private Graphics2D graphics2D = null;
    /** 图片缓冲区 */
    private BufferedImage bufferedImage = null;

    // +++++++++++++++++++++++++++++ 自定义的水印参数 ++++++++++++++++++++++++++++++++++++++++
    /** 文字字体 */
    private String fontName  = null;
    /** 文字样式 */
    private int fontStyle;
    /** 文字大小 */
    private int fontSize;
    /** 文字颜色 */
    private Color fontColor;
    /** 透明度 */
    private float alpha;
    /** 外框宽度 */
    private int borderWidth;
    /** 旋转高度 */
    private double angdeg;
    /** 间距 */
    private int spacing;
    /** 最后图片保存路径 */
    private String savePath = null;

    public ImageWaterTool(Builder builder) {
        this.fontText = builder.fontText;
        this.imgText = builder.imgText;
        this.filePath = builder.filePath;
        this.fontName = builder.fontName;
        this.fontStyle = builder.fontStyle;
        this.fontSize = builder.fontSize;
        this.fontColor = builder.fontColor;
        this.alpha = builder.alpha;
        this.borderWidth = builder.borderWidth;
        this.angdeg = builder.angdeg;
        this.spacing = builder.spacing;
        this.savePath = builder.savePath;
    }

    public static class Builder {

        // ++++++++++++++++++++++++++ 配置参数 +++++++++++++++++++++++++++++++++++++++++++++++++++
        /** 文字水印内容 */
        private String fontText = null;
        /** 图片水印内容 */
        private String imgText = null;
        /** 操作的图片文件 */
        private String filePath = null;

        // +++++++++++++++++++++++++++++ 自定义的水印参数 ++++++++++++++++++++++++++++++++++++++++
        /** 文字字体 */
        private String fontName = "微软雅黑";
        /** 文字样式 */
        private int fontStyle = Font.BOLD | Font.ITALIC;
        /** 文字大小 */
        private int fontSize = 30;
        /** 文字颜色 */
        private Color fontColor = Color.black;
        /** 透明度 */
        private float alpha = 0.3f;
        /** 外框宽度 */
        private int borderWidth = 20;
        /** 旋转高度 */
        private double angdeg = 30;
        /** 间距 */
        private int spacing = 200;
        /** 最后图片保存路径 */
        private String savePath = null;


        public Builder setFontText(String fontText) {
            this.fontText = fontText;
            return this;
        }

        public Builder setImgText(String imgText) {
            this.imgText = imgText;
            return this;
        }

        public Builder setFilePath(String filePath) {
            this.filePath = filePath;
            return this;
        }

        public Builder setFontName(String fontName) {
            this.fontName = fontName;
            return this;
        }

        public Builder setFontStyle(int fontStyle) {
            this.fontStyle = fontStyle;
            return this;
        }

        public Builder setFontSize(int fontSize) {
            this.fontSize = fontSize;
            return this;
        }

        public Builder setFontColor(Color fontColor) {
            this.fontColor = fontColor;
            return this;
        }

        public Builder setAlpha(float alpha) {
            this.alpha = alpha;
            return this;
        }

        public Builder setBorderWidth(int borderWidth) {
            this.borderWidth = borderWidth;
            return this;
        }

        public Builder setAngdeg(double angdeg) {
            this.angdeg = angdeg;
            return this;
        }

        public Builder setSpacing(int spacing) {
            this.spacing = spacing;
            return this;
        }

        public Builder setSavePath(String savePath) {
            this.savePath = savePath;
            return this;
        }

        public ImageWaterTool build () throws Exception {
            return new ImageWaterTool(this);
        }
    }

    public static enum Position{
        /** 上左 */
        TOP_LEFT(1),
        /** 上右 */
        TOP_RIGHT(2),
        /** 下左 */
        BOTTOM_LEFT(3),
        /** 下右 */
        BOTTOM_RIGHT(4)
        ;
        public int type;

        Position(int type) {
            this.type = type;
        }

        public int getType() {
            return type;
        }
    }

    // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    /**
     * @function              设置文字或者图片水印位置
     * @param position    添加水印的位置
     * @param waterWidth      添加水印的宽度
     * @param waterHeight     添加水印的高度
     * @param type            true:文字  ——  false:图片
     * @return                int[]  x, y
     */
    private int[] setPosition (int position, int waterWidth, int waterHeight, boolean type) {
        int x = width - waterWidth;
        int y = height - waterHeight;
        switch (position) {
            case 1:
                x = type ? borderWidth : 0;
                y = type ? borderWidth : 0;
                break;
            case 2:
                y = type ? borderWidth : 0;
                break;
            case 3:
                x = type ? borderWidth : 0;
                y = type ? y - borderWidth : y;
                break;
            case 4:
            default:
                x = type ? x - borderWidth : x;
                y = type ? y - borderWidth : y;
                break;
        }
        return new int[]{x, y};
    }

    /**
     * 初始化参数
     */
    private void init () {
        try {
            // 获取图片示例,并获取图片的高度,宽度
            Image img = ImageIO.read(new File(filePath));
            width = img.getWidth(null);
            height = img.getHeight(null);
            // 创建图片缓冲区
            bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            // 创建绘图工具
            graphics2D = bufferedImage.createGraphics();
            // 将原图放到缓冲区
            graphics2D.drawImage(img, 0, 0, width, height, null);
        } catch (IOException e) {
            System.out.println("文件读写异常");
            e.printStackTrace();
        }
    }

    /**
     * 将图片保存到磁盘
     */
    private void save () {
        String path = null;
        if ((savePath == null) || (savePath.equals(""))) {
            path = filePath;
        } else {
            path = savePath;
        }
        // 将缓冲区图片放到磁盘上
        try (FileOutputStream os = new FileOutputStream(path)) {
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(os);
            encoder.encode((bufferedImage));
        } catch (IOException e) {
            System.out.println("文件读写异常");
            e.printStackTrace();
        }
    }

    /**
     * 获取文字位置
     * @param text
     * @return
     */
    private int getTextLength (String text) {
        int len = text.length();
        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                len ++;
            }
        }
        return len % 2 == 0 ? len / 2 : len / 2 + 1;
    }

    /**
     * 添加单个文字水印
     * @throws IOException
     * @param place
     */
    public void addFontWater(Position place) {
        init();
        // 创建文字水印的样式
        graphics2D.setFont(new Font(fontName, fontStyle, fontSize));
        // 文字颜色
        graphics2D.setColor(fontColor);
        // 获取文字位置x,y坐标
        int type = place.getType();
        int[] position = setPosition(type, fontSize * getTextLength(fontText), fontSize, true);
        int x = position[0];
        int y = position[1] + fontSize;
        // 将文字写入指定位置,并关闭画笔资源
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        graphics2D.drawString(fontText, x, y);
        graphics2D.dispose();
        save();
    }

    /**
     * 添加单个图片水印
     * @throws IOException
     */
    public void addPicWater (Position place) throws IOException {
        init();
        // 创建图片水印
        Image imageWater = ImageIO.read(new File(imgText));
        // 获取文字位置x,y坐标
        int type = place.getType();
        int[] position = setPosition(type, imageWater.getWidth(null), imageWater.getHeight(null), false);
        int x = position[0];
        int y = position[1];
        // 将文字写入指定位置,并关闭画笔资源
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        graphics2D.drawImage(imageWater, x, y, null);
        graphics2D.dispose();
        save();
    }

    /**
     * 添加多个文字水印
     * @throws IOException
     */
    public void addManyFontWater () {
        init();
        // 创建文字水印的样式
        graphics2D.setFont(new Font(fontName, fontStyle, fontSize));
        graphics2D.setColor(fontColor);
        // 获取文字宽高
        int waterWidth = fontSize * getTextLength(fontText);
        int waterHeight = fontSize;
        // 将文字写入指定位置,并关闭画笔资源
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        // 将文字旋转30度
        graphics2D.rotate(Math.toRadians(angdeg), width / 2, height / 2);
        // 添加多个
        int x = -width / 2;
        while (x < width * 1.5) {
            int y = -height / 2;
            while (y < height * 1.5) {
                graphics2D.drawString(fontText, x, y);
                y += waterHeight + spacing;
            }
            x += waterWidth + spacing;
        }
        graphics2D.dispose();
        save();
    }

    /**
     * 添加多个图片水印
     * @throws IOException
     */
    public void addManyPicWater () throws IOException {
        // 初始化
        init();
        // 创建图片水印
        Image imageWater = ImageIO.read(new File(imgText));
        // 获取水印图片的宽高
        int waterWidth = imageWater.getWidth(null);
        int waterHeight = imageWater.getHeight(null);
        // 将文字写入指定位置,并关闭画笔资源
        graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        // 将文字旋转30度
        graphics2D.rotate(Math.toRadians(angdeg), width / 2, height / 2);
        // 添加多个
        int x = -width / 2;
        while (x < width * 1.5) {
            int y = -height / 2;
            while (y < height * 1.5) {
                graphics2D.drawImage(imageWater, x, y, null);
                y += waterHeight + spacing;
            }
            x += waterWidth + spacing;
        }
        graphics2D.dispose();
        save();
    }

    public static Builder create = new ImageWaterTool.Builder();

    public static void main(String[] args) throws Exception {
        ImageWaterTool.create
                .setFilePath("C:\\Users\\long\\Desktop\\test-1.png")
                .setFontText("https://blog.csdn.net/yhflyl")
                .setFontSize(30)
                .build()
                .addFontWater(Position.BOTTOM_RIGHT);

        // 多个文字水印
//        ImageWaterTool.create
//                // 设置水印文字
//                .setFontText("我的小笨蛋")
//                .setFilePath("C:\\Users\\long\\Desktop\\笨蛋1.jpg")
//                // 设置添加水印后的图片路径
                .setSavePath("C:\\Users\\long\\Desktop\\pic-444.png")
//                // 设置多个文字之间的距离
//                .setSpacing(100)
//                .setAngdeg(150)
//                //设置水印的透明度
//                .setAlpha(0.2f)
//                .build()
//                .addManyFontWater();
        // 多个图片水印
//        ImageWaterTool.create
//                .setFilePath("C:\\Users\\long\\Desktop\\笨蛋.jpg")
//                .setImgText("C:\\Users\\long\\Desktop\\logo.png")
//                .build()
//                .addManyPicWater();
    }
}

 

标签:Java,String,int,水印,private,加水,null,public,图片
来源: https://www.cnblogs.com/jijm123/p/13874725.html