package cn.wisenergy.common.utils;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class ImageUtil {

    /**
     * JAVA添加文字水印
     *
     * @param srcImage   目标图片
     * @param waterImage 水印图片
     * @return
     */
    public static byte[] watermarkImageSimple1(BufferedImage srcImage, BufferedImage waterImage) throws IOException {
        int bgWidth = srcImage.getWidth(null);
        int bgHeight = srcImage.getHeight(null);
        BufferedImage image = new BufferedImage(bgWidth, bgHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.drawImage(srcImage, 0, 0, bgWidth, bgHeight, null);
        g.drawImage(waterImage, bgWidth - 200, bgHeight - 200, waterImage.getWidth(), waterImage.getHeight(), null);
        g.dispose();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        ImageIO.write(image, "jpg", out);
        return out.toByteArray();
    }

    /**
     * JAVA添加文字水印
     *
     * @param srcImage   目标图片
     * @param waterImage 水印图片
     * @return
     */
    public static byte[] watermarkImageSimple(BufferedImage srcImage, BufferedImage waterImage) {
        Graphics2D graphics = srcImage.createGraphics();
        graphics.drawImage(waterImage, srcImage.getWidth() - 100, 0, waterImage.getWidth(), waterImage.getHeight(), null);
        graphics.dispose();

        ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
        imgWriteParams.setCompressionMode(ImageWriteParam.MODE_DISABLED);
        //imgWriteParams.setCompressionQuality(1.0f);
        imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IIOImage iIamge = new IIOImage(waterImage, null, null);
        try {
            writer.setOutput(ImageIO.createImageOutputStream(baos));
            writer.write(null, iIamge, imgWriteParams);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return baos.toByteArray();
    }

    /**
     * JAVA添加文字水印
     *
     * @param srcImage   目标图片
     * @param waterImage 水印图片
     * @return
     */
    public static byte[] watermarkImageSimple(byte[] srcImage, byte[] waterImage) throws IOException {
        //使用ImageIO的read方法读取图片
        ByteArrayInputStream srcImageStream = new ByteArrayInputStream(srcImage);
        BufferedImage read = ImageIO.read(srcImageStream);

        ByteArrayInputStream waterImageStream = new ByteArrayInputStream(srcImage);
        BufferedImage image = ImageIO.read(waterImageStream);
        Graphics2D graphics = read.createGraphics();
        graphics.drawImage(image, read.getWidth() - 100, 0, image.getWidth(), image.getHeight(), null);
        graphics.dispose();

        ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
        imgWriteParams.setCompressionMode(ImageWriteParam.MODE_DISABLED);
        //imgWriteParams.setCompressionQuality(1.0f);
        imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IIOImage iIamge = new IIOImage(image, null, null);
        try {
            writer.setOutput(ImageIO.createImageOutputStream(baos));
            writer.write(null, iIamge, imgWriteParams);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return baos.toByteArray();
    }


    /**
     * JAVA添加文字水印
     *
     * @param srcImage   目标图片
     * @param waterImage 水印图片
     * @param x          水印图片距离目标图片左侧的偏移量，如果x<0, 则在正中间
     * @param y          水印图片距离目标图片上侧的偏移量，如果y<0, 则在正中间
     * @param alpha      透明度(0.0 -- 1.0, 0.0为完全透明，1.0为完全不透明)
     * @param degree     水印图片旋转角度
     * @return
     */
    public static byte[] watermarkImage(byte[] srcImage, byte[] waterImage, int x, int y, float alpha, Integer degree) throws IOException {
        //使用ImageIO的read方法读取图片
        ByteArrayInputStream srcImageStream = new ByteArrayInputStream(srcImage);
        BufferedImage read = ImageIO.read(srcImageStream);
        ByteArrayInputStream waterImageStream = new ByteArrayInputStream(srcImage);
        BufferedImage image = ImageIO.read(waterImageStream);

        //获取画布
        Graphics2D graphics = read.createGraphics();
        //设置透明度为0.5
        graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f));
        //添加水印
        if (x == 0) {
            x = read.getWidth() - 100;
        }
        graphics.drawImage(image, x, 0, image.getWidth(), image.getHeight(), null);
        //关闭透明度
        //graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        graphics.dispose();

        // 开始打包图片，写入byte[] 取得内存输出流 指定写图片的方式为jpg
        ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
        // 要使用压缩，必须指定压缩方式为MODE_EXPLICIT
        imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        // 这里指定压缩的程度，参数qality是取值0~1范围内，
        imgWriteParams.setCompressionQuality(1.0f);
        imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        IIOImage iIamge = new IIOImage(image, null, null);
        try {
            // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
            // 通过ImageIo中的静态方法，得到byteArrayOutputStream的ImageOutput
            writer.setOutput(ImageIO.createImageOutputStream(baos));
            writer.write(null, iIamge, imgWriteParams);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return baos.toByteArray();
    }

    /**
     * @param srcFile 原图路径
     * @return
     * @throws IOException
     */
    public static byte[] compressPic(byte[] srcFile, float quality) throws IOException {
        // 指定写图片的方式为 jpg
        ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
        ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);
        // 要使用压缩，必须指定压缩方式为MODE_EXPLICIT
        imgWriteParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        // 这里指定压缩的程度，参数qality是取值0~1范围内，
        imgWriteParams.setCompressionQuality(quality);
        imgWriteParams.setProgressiveMode(ImageWriteParam.MODE_DISABLED);

        ByteArrayInputStream in = new ByteArrayInputStream(srcFile);
        BufferedImage image = ImageIO.read(in);
        // ColorModel.getRGBdefault();
        ColorModel colorModel = image.getColorModel();
        imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));

        // 开始打包图片，写入byte[]
        // 取得内存输出流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        IIOImage iIamge = new IIOImage(image, null, null);
        try {
            // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
            // 通过ImageIo中的静态方法，得到byteArrayOutputStream的ImageOutput
            writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
            writer.write(null, iIamge, imgWriteParams);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return byteArrayOutputStream.toByteArray();
    }

}
