编程语言
首页 > 编程语言> > 记录一下 Java 合成图片 类似与小程序海报二维码,合成过程很慢

记录一下 Java 合成图片 类似与小程序海报二维码,合成过程很慢

作者:互联网

记录一下 Java 合成图片 类似与小程序海报二维码,合成过程很慢

import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import me.zhengjie.utils.FileUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

/**
 * 合成图片
 * 记录一下合成图片
 */
public class ImgUtils {
    String templatePath = "D:\\download\\bgcq.png"; // 背景图
    String seedPath = "D:\\download\\16534475114971.jpg"; // 二维码图

    public static void main(String[] args) {
        ImgUtils imgUtil = new ImgUtils();
        imgUtil.SyntheticImages();
    }


    public void SyntheticImages() {

        //背景
        File templateFlie = new File(templatePath);
        BufferedImage bg = null;//读取背景图片
        // 透明颜色
        Color c = new Color(0f, 0f, 0f, .0f);
        try {
            bg = ImageIO.read(templateFlie);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int height = bg.getHeight();//背景图片的高
        int width = bg.getWidth();  //背景图片的宽

        BufferedImage qcCode = null;  // 读取二维码图片
        try {
            qcCode = ImageIO.read(new File(seedPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);//创建画布 TYPE_INT_ARGB 可以设置颜色透明度
        Graphics2D g = img.createGraphics();//生成画笔 开启画图
        // 设置背景色
        g.setBackground(c);
        // 绘制背景图片
        g.drawImage(bg.getScaledInstance(width, height, Image.SCALE_DEFAULT), 0, 0, null); // 绘制缩小后的图

        //绘制二维码图片  定位到背景图的右下角
        g.drawImage(qcCode.getScaledInstance(516, 516, Image.SCALE_DEFAULT), 45, 138, null); // 绘制缩小后的图

        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗锯齿
        Font font = new Font("苹方-简", Font.BOLD, 24);// 添加字体的属性设置 字体要注意如果系统没有该字体,执行完可能不是预期
        g.setFont(font);
        g.setColor(Color.white);
        g.drawString("加入团队", 60, 55);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Font font2 = new Font("苹方-简", Font.PLAIN, 18);// 添加字体的属性设置
        g.setFont(font2);
        g.setColor(Color.white);
        g.drawString("微信扫码加入xx团队,无需审核直接加入", 60, 95);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        Font font3 = new Font("苹方-简", Font.BOLD, 32);// 添加字体的属性设置
        g.setFont(font3);
        g.setColor(Color.black);
        g.drawString("xxx经济技术开发区安全生产监督管", 35, 743);
        g.drawString("理局志愿服务队", 35, 778);

        //关掉画笔
        g.dispose();

        try {
            ImageIO.write(img, "png", new File("D:\\download\\x13.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("合成图片成功,路径:" + "D:\\download");
    }

    /**
     * 使用hutool 工具类
     */
    public void SyntheticImages2() {
        // 生成的二维码
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        QrCodeUtil.generate("https://hutool.cn/", 516, 516, ImgUtil.IMAGE_TYPE_JPG, outputStream);

        // 要输出的图片
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        // 将图片合成在一起
        ImgUtil.pressImage(
                FileUtil.getInputStream(templatePath), // 主图片
                out, // 输出图片
                ImgUtil.read(new File(seedPath)).getScaledInstance(516, 516, Image.SCALE_DEFAULT), //水印图片
                0, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                0, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                1.0f
        );

        ByteArrayOutputStream out2 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out.toByteArray()), //
                out2, //
                "加入团队", Color.WHITE, //文字
                new Font("苹方-简", Font.BOLD, 24), //字体
                -190, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                -361, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                1.0f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        );

        ByteArrayOutputStream out3 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out2.toByteArray()), //
                out3, //
                "微信扫码加入xxx团队,无需审核直接加入", Color.WHITE, //文字
                new Font("苹方-简", Font.PLAIN, 18), //字体
                -68, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                -321, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                1.0f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        );


        ByteArrayOutputStream out4 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out3.toByteArray()), //
                out4, //
                "xxx经济技术开发区安全生产监督管", Color.black, //文字
                new Font("苹方-简", Font.BOLD, 32), //字体
                -5, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                323, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                1.0f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        );

        ByteArrayOutputStream out5 = new ByteArrayOutputStream();
        ImgUtil.pressText(//
                new ByteArrayInputStream(out4.toByteArray()), //
                out5, //
                "理局志愿服务队", Color.black, //文字
                new Font("苹方-简", Font.BOLD, 32), //字体
                -165, //x坐标修正值。 默认在中间,偏移量相对于中间偏移
                363, //y坐标修正值。 默认在中间,偏移量相对于中间偏移
                1.0f//透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
        );

        FileUtil.writeBytes(out5.toByteArray(), FileUtil.file("D:\\download\\x10.jpg"));

    }
}

 

标签:Java,import,合成,偏移量,中间,二维码,ByteArrayOutputStream,new,Font
来源: https://www.cnblogs.com/KingPingyue/p/16317262.html