在一些场景下,我们经常会通过判断字符串的长度,比如个数来实现换行(这个具体实施,请参考String根据字数进行分隔,然后逻辑自己控制),但是中文、英文、数字、其实在展示的时候同样长度的字符串,其实它的宽度是不一样的,这也是们我通俗意义上说的宽度(像素)
/**
* 10、自己做图片 ,根据文本宽度进行换行
*/
@Test
public void creatMyImage(){
//整体图合成
BufferedImage bufferedImage = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
//设置图片的背景色
Graphics2D main = bufferedImage.createGraphics();
main.fillRect(0, 0, 500, 500);
String text = "111122223所以比传统纸巾更环保3334441比传统纸巾更环11111111111111122223所以比传统纸巾更环保3334441比传统纸巾更环11111111111111122223所以比传统纸巾更环保3334441比传统纸巾更环11111111111111122223所以比传统纸巾更环保3334441比传统纸巾更环11111111111";
Graphics2D textG = bufferedImage.createGraphics() ;
textG.setColor(new Color(37,37,37));
Font hualaoContentFont = new Font("PingFang SC", Font.PLAIN, 20);
textG.setFont(hualaoContentFont);
textG.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
drawString(textG,text,30,100,4,10,50,true,false);
//存储到本地
String saveFilePath = "/Users/healerjean/Desktop/new.png";
saveImageToLocalDir(bufferedImage, saveFilePath);
}
/**
*
* @param g
* @param text 文本
* @param lineHeight 行高(注意字体大小的控制哦)
* @param maxWidth 行宽
* @param maxLine 最大行数
* @param left 左边距 //整段文字的左边距
* @param top 上边距 //整顿文字的上边距
* @param trim 是否修剪文本(1、去除首尾空格,2、将多个换行符替换为一个)
* @param lineIndent 是否首行缩进
*/
public static void drawString(Graphics2D g, String text, float lineHeight, float maxWidth, int maxLine, float left,
float top, boolean trim, boolean lineIndent) {
if (text == null || text.length() == 0) return;
if(trim) {
text = text.replaceAll("\\n+", "\n").trim();
}
if(lineIndent) {
text = " " + text.replaceAll("\\n", "\n ");
}
drawString(g, text, lineHeight, maxWidth, maxLine, left, top);
}
/**
*
* @param g
* @param text 文本
* @param lineHeight 行高
* @param maxWidth 行宽
* @param maxLine 最大行数
* @param left 左边距
* @param top 上边距
*/
private static void drawString(Graphics2D g, String text, float lineHeight, float maxWidth, int maxLine, float left,
float top) {
if (text == null || text.length() == 0) return;
FontMetrics fm = g.getFontMetrics();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
sb.append(c);
int stringWidth = fm.stringWidth(sb.toString());
if (c == '\n' || stringWidth > maxWidth) {
if(c == '\n') {
i += 1;
}
if (maxLine > 1) {
g.drawString(text.substring(0, i), left, top);
drawString(g, text.substring(i), lineHeight, maxWidth, maxLine - 1, left, top + lineHeight);
} else {
g.drawString(text.substring(0, i - 1) + "…", left, top);
}
return;
}
}
g.drawString(text, left, top);
}