java 将 text 文字、文本 内容 转为 图片
参考了大神的代码,大神的分割算法很精妙,将大神的代码进行了优化,做个留存
大神博客地址:https://xunming.blog.csdn.net/article/details/91956952
更改后的功能:
1.将长文本生成长图片,不会进行分割
2.根据文本内容自动计算图片的高度,图片的宽度默认是960,每一行的高度默认是24
3.生成图片 宽度会多20px(以防最后一个字显示不全),高度会多一行(即多24px)
package com.example.demo.util;
import sun.font.FontDesignMetrics;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.imageio.ImageIO;
/**
* 如果一行文字长度超过了既定的宽度,那么主动执行换行操作
*/
public class TextToImage {
/**
* 图片宽度
*/
private static int width = 960;
/**
* 每一行的高度
*/
private static int line_height = 24;
/**
* 字体
*/
private static Font font = new Font("宋体", Font.PLAIN, 14);
public static void main(String[] args) throws Exception {
String message = "这里输入你的文本,或者从文件系统中去读";
String[] strArr = message.split("\n");
createImage(strArr);
}
public static void createImage(String[] strArr) throws Exception {
FontMetrics fm = FontDesignMetrics.getMetrics(font);
int stringWidth = fm.charWidth('字');// 标点符号也算一个字
//计算每行多少字 = 宽/每个字占用的宽度
int line_string_num = width % stringWidth == 0 ? (width / stringWidth) : (width / stringWidth) + 1;
System.out.println("每行字数=" + line_string_num);
//将数组转为list
List<String> strList = new ArrayList<>(Arrays.asList(strArr));
//按照每行多少个字进行分割
for (int j = 0; j < strList.size(); j++) {
//当字数超过限制,就进行分割
if (strList.get(j).length() > line_string_num) {
//将多的那一端放入本行下一行,等待下一个循环处理
strList.add(j + 1, strList.get(j).substring(line_string_num));
//更新本行的内容
strList.set(j, strList.get(j).substring(0, line_string_num));
}
}
//计算图片的高度,多预留一行
int image_height = strList.size() * line_height + line_height;
//每张图片有多少行文字
int every_line = image_height / line_height;
for (int m = 0; m < 1; m++) {
String filePath = "E:\\新建文件夹\\" + m + ".jpg";
File outFile = new File(filePath);
// 创建图片 宽度多预留一点
BufferedImage image = new BufferedImage(width + 20, image_height,
BufferedImage.TYPE_INT_BGR);
Graphics g = image.getGraphics();
g.setClip(0, 0, width + 20, image_height);
g.setColor(Color.white); // 背景色白色
g.fillRect(0, 0, width + 20, image_height);
g.setColor(Color.black);// 字体颜色黑色
g.setFont(font);// 设置画笔字体
// 每张多少行,当到最后一张时判断是否填充满
for (int i = 0; i < every_line; i++) {
int index = i + m * every_line;
if (strList.size() - 1 >= index) {
// System.out.println("每行实际=" + newList.get(index).length());
g.drawString(strList.get(index), 0, line_height * (i + 1));
}
}
g.dispose();
ImageIO.write(image, "jpg", outFile);// 输出png图片
}
}
}