前序
本周接到了新项目中的一个需求:根据给定的内容合成一张图片,需求如下:
- 标题自动换行,如果标题中出现英文单词时,以单词为最小单元进行换行。
- 如果行数超过5行省略用 … 代替。
- 符号是下一行首字母时,自动截留到上一行末尾。
- 空格为下一行开头,则删除空格,显示单词,保持内容左对齐
技术栈(JAI)
Java Advanced Imaging (JAI) 是一个用于处理图像的开源Java库。它提供了一个框架,可以用来访问各种图像源,包括本地文件系统、网络资源以及数据库等,并可以对这些图像进行转换和分析。
优点:JDK 自带内容,操作简单,不用引入新的依赖。
代码概述
本功能通过加载本地的背景图片和传入的参数进行图片的合成。主要包含了背景图、二维码插图和文本内容。其中二维码插图通过 HuTool
工具包提供生成方法。
具体代码
QrCodeImageConfig.java(二维码插图配置类)
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
/**
* 插图参数
*/
@Getter
@Slf4j
public class QrCodeImageConfig {
/**
* 二维码内容
*/
private final String text;
/**
* 二维码宽度
*/
private final Integer width;
/**
* 二维码高度
*/
private final Integer height;
/**
* 二维码颜色
*/
private final Color color;
/**
* 二维码图片接收对象
*/
private final File qrCodeImgFile;
/**
* JAI 图片对象
*/
private final BufferedImage qrCodeBuffer;
/**
* 构造函数
*
* @param text 二维码内容
* @param width 二维码宽度
* @param height 二维码高度
* @param color 二维码颜色
* @param qrCodeImg 二维码图片接收对象
*/
public QrCodeImageConfig(String text, Integer width, Integer height, Color color, File qrCodeImg) {
if (StringUtils.isBlank(text) || width == null || height == null || color == null || qrCodeImg == null) {
throw new IllegalArgumentException("QrCodeImageParam.QrCodeImageParam 参数异常");
}
this.color = color;
this.width = width;
this.height = height;
this.text = text;
this.qrCodeImgFile = qrCodeImg;
try {
QrConfig config = new QrConfig(width, height);
config.setBackColor(color);
config.setMargin(1);
QrCodeUtil.generate(text, config, qrCodeImg);
this.qrCodeBuffer = ImageIO.read(qrCodeImg);
} catch (IOException e) {
throw new RuntimeException("QrCodeImageParam.QrCodeImageParam2 二维码图片配置创建异常");
}
}
/**
* 获取图片高度
*/
public int getImageHeight() {
return qrCodeBuffer.getHeight();
}
/**
* 获取图片宽度
*/
public int getImageWidth() {
return qrCodeBuffer.getWidth();
}
}
TextConfig.java(文本内容配置类)
import lombok