package com.cusc.nirvana.user.rnr.fp.common.util;

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

/**
 * @className: WatermarkUtil
 * @description: 移动图片加水印
 * @author: jk
 * @date: 2022/8/9 16:02
 * @version: 1.0
 **/
public class WatermarkUtil {
    /**
     * 图片加水印
     *
     * @param src        源图片
     * @param out        输出图片
     * @param fontSize   字体大小，设置为 10
     * @param alpha      透明度，设置为 60
     * @param x          右下角，右边偏移量
     * @param y          右下角，底部偏移量
     * @param waterMarks 水印文字内容数组，每个 item 代表一行
     * @throws IOException
     */
    public static void waterPress(InputStream src, OutputStream out, int fontSize, float alpha, int x, int y, String[] waterMarks) throws IOException {
        // 读取原图片信息
        Image srcImg = ImageIO.read(src);
        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(Color.RED);
        // 设置水印文字字体
        g.setFont(font);
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
        // 获取水印文字中最长的
        int maxLength = 0;
        for (String waterMarkContent : waterMarks) {
            int fontlen = getWatermarkLength(waterMarkContent, g);
            if (maxLength < fontlen) {
                maxLength = fontlen;
            }
        }
        int length = waterMarks.length;
        for (int j = 0; j < length; j++) {
            String waterMark = waterMarks[j];
            int tempX = 10;
            int tempY = fontSize;
            // 单字符长度
            int tempCharLen = 0;
            // 单行字符总长度临时计算
            int tempLineLen = 0;
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < waterMark.length(); i++) {
                char tempChar = waterMark.charAt(i);
                tempCharLen = getCharLen(tempChar, g);
                tempLineLen += tempCharLen;
                if (tempLineLen >= srcImgWidth) {
                    // 长度已经满一行,进行文字叠加
                    g.drawString(sb.toString(), tempX, tempY);
                    // 清空内容,重新追加
                    sb.delete(0, sb.length());
                    tempLineLen = 0;
                }
                // 追加字符
                sb.append(tempChar);
            }
            // 通过设置后两个输入参数给水印定位
            g.drawString(sb.toString(), srcImgWidth - maxLength - x, srcImgHeight - (length - j - 1) * tempY - y);
        }
        g.dispose();
        // 输出图片
        ImageIO.write(bufImg, "jpg", out);
        out.flush();
        out.close();
    }

    private static int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }

    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) throws IOException {
        // 原图位置, 输出图片位置, 水印文字颜色, 水印文字
        String font = " 中 国 移 动 车 联 卡 实 名 登 记,2020-05-27 17:00:00,abcefg123-1234567890123456";
        WatermarkUtil.waterPress(new FileInputStream("C:\\Users\\PC\\Desktop\\文档\\演示数据\\魏身份证正面.jpg"),
                new FileOutputStream("C:\\Users\\PC\\Desktop\\文档\\演示数据\\out.jpg"),
                14, 0.9f, 30, 30, font.split(","));
    }
}
