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


