记录一下 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")); } }