package com.dgtis.dorm.manager.db.util.wx;

import org.springframework.core.io.InputStreamResource;

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

/**
 * 二维码工具类
 *
 * @author huanghaoqi
 * @version 1.0
 * @date 2019年01月04日 09:51:41
 * @since JDK1.8
 */
public class QrCodeUtil {
    public static InputStreamResource changeImage(InputStream inputStream, String name) {
        try {

            // 宽度
            int width = 440;
            // 高度
            int height = 440;
            BufferedImage bufferedImage = ImageIO.read(inputStream);
            // 重新创建一张图片 设置大小
            BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
            Graphics2D g2 = (Graphics2D) bimg.getGraphics();
            //设置背景色
            g2.setBackground(Color.WHITE);
            //通过使用当前绘图表面的背景色进行填充来清除指定的矩形。
            g2.clearRect(0, 0, width, height);
            // 绘制二维码
            Graphics graphics = bimg.createGraphics();
            graphics.drawImage(bufferedImage, 20, 0, 400, 400, null);
            // 将二维码内容写进新的图片
            ByteArrayOutputStream firstOutput = inputParseOutputStream(inputStream);
            ImageIO.write(bimg, "JPG", firstOutput);
            InputStream firstInput = new ByteArrayInputStream(firstOutput.toByteArray());

            // 准备设置图片样式
            BufferedImage secondBufferedImage = ImageIO.read(firstInput);
            //得到Graphics2D 对象
            Graphics2D g2d = (Graphics2D) secondBufferedImage.getGraphics();
            //设置颜色和画笔粗细
            g2d.setColor(Color.black);
            g2d.setStroke(new BasicStroke(5));
            // 设置字体
            Font dynamicFont = new Font("微软雅黑", Font.PLAIN, 32);
            g2d.setFont(dynamicFont);
            //绘制图案或文字
            // 计算文字长度，计算居中的x点坐标
            FontMetrics fm = g2d.getFontMetrics(dynamicFont);
            int textWidth = fm.stringWidth(name);
            int widthX = (width - textWidth) / 2;
            // 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。
            g2d.drawString(name, widthX, 425);
            // 释放对象
            g2d.dispose();
            ByteArrayOutputStream os = inputParseOutputStream(firstInput);
            ImageIO.write(secondBufferedImage, "JPG", os);
            InputStream is = new ByteArrayInputStream(os.toByteArray());
            return new InputStreamResource(is);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 方法描述  将inputStream转outputStream
     *
     * @author huanghaoqi
     * @date 2019年01月04日 09:49:01
     */
    private static ByteArrayOutputStream inputParseOutputStream(InputStream in) throws Exception {
        ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
        int ch;
        while ((ch = in.read()) != -1) {
            swapStream.write(ch);
        }
        return swapStream;
    }
}
