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

/**
 * 水印工具类
 *
 * @author Ade.Xiao 2021/1/28 11:11
 */
public class AddWatermarkUtil {
    /**
     * 给图谱添加水印
     *
     * @param srcImgPath       源文件
     * @param outImgPath       目标文件
     * @param markContentColor 文字颜色
     * @param fontSize         文字大小
     * @param waterMarkContent 文字内容
     * @author Ade.Xiao 2021/1/28 11:17
     */
    private static void waterPress(String srcImgPath, String outImgPath, Color markContentColor, int fontSize, String waterMarkContent) {
        try {
            // || 做分隔换行
            String[] waterMarkContents = waterMarkContent.split("\\|\\|");
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);
            Image srcImg = ImageIO.read(srcImgFile);
            int srcImgWidth = srcImg.getWidth(null);
            int srcImgHeight = srcImg.getHeight(null);
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 得到画笔对象
            Graphics2D g = bufImg.createGraphics();

            // 设置起点
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            Font font = new Font("宋体", Font.PLAIN, fontSize);
            // 根据图片的背景设置水印颜色
            g.setColor(markContentColor);
            // 设置水印文字字体
            g.setFont(font);
            // 数组长度
            int contentLength = waterMarkContents.length;
            // 获取水印文字中最长的
            int maxLength = 0;
            for (int i = 0; i < contentLength; i++) {
                int fontlen = getWatermarkLength(waterMarkContents[i], g);
                if (maxLength < fontlen) {
                    maxLength = fontlen;
                }
            }

            for (int j = 0; j < contentLength; j++) {
                waterMarkContent = waterMarkContents[j];
                int tempX = 10;
                int tempY = fontSize;
                // 单字符长度
                int tempCharLen = 0;
                // 单行字符总长度临时计算
                int tempLineLen = 0;
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < waterMarkContent.length(); i++) {
                    char tempChar = waterMarkContent.charAt(i);
                    tempCharLen = getCharLen(tempChar, g);
                    tempLineLen += tempCharLen;
                    if (tempLineLen >= srcImgWidth) {

                        //左下角
                        // g.drawString(sb.toString(), 0, srcImgHeight - (contentLength - j - 1) * tempY);
                        //右下角
                        // g.drawString(sb.toString(), srcImgWidth - maxLength, srcImgHeight - (contentLength - j - 1) * tempY);

                        // 长度已经满一行,进行文字叠加
                        g.drawString(sb.toString(), tempX, tempY);
                        // 清空内容,重新追加
                        sb.delete(0, sb.length());
                        tempLineLen = 0;
                    }
                    // 追加字符
                    sb.append(tempChar);
                }
                // 通过设置后两个输入参数给水印定位
                g.drawString(sb.toString(), 20, srcImgHeight - (contentLength - j - 1) * tempY - 50);
            }
            g.dispose();

            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 字符长度
     *
     * @param c 字符
     * @param g 字符字体
     * @return
     * @author Ade.Xiao 2021/1/28 11:19
     */
    private static int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }

    /**
     * 获取水印文字总长度
     *
     * @paramwaterMarkContent水印的文字
     * @paramg
     * @return水印文字总长度
     * @author Ade.Xiao 2021/1/28 11:16
     */
    private static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont())
                .charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }


    public static void main(String[] args) {
        // 原图位置, 输出图片位置, 水印文字颜色, 水印文字
        String font = "2021年01月27日 13:00:34||宁夏回族自治州银川贺楠县xxx路7号||XXXXX贸易有限公司||(11.1231231,32.2222)";
        String inputAddress = "C:\\Users\\ALIENWARE-AREA-51M\\Desktop\\drivingLicenseBack.jpg";
        String outputAddress = "C:\\Users\\ALIENWARE-AREA-51M\\Desktop\\drivingLicenseBack2.jpg";
        Color color = Color.RED;
        waterPress(inputAddress, outputAddress, color, 50, font);
    }
}

  

posted on 2021-01-28 13:42  肖建锋  阅读(271)  评论(0编辑  收藏  举报