前言
- 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com/fengfanli/draw_poster_echarts
- 海报制作的所有博客和一些问题:
- 总博客:java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
文字换行算法详解
,传送门:java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解头像切割成圆形方法详解
,传送门:java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解获取微信二维码详情
,传送门:java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上java BufferedImage 转 InputStream
和png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
,传送门:java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色java 整合echarts 画出 折线图
,传送门:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
,传送门:java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题项目部署到linux下中文不显示,echarts图上的中文也不显示问题
,传送门:java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
- 本次博客主要是 稍微说一下文字换行算法,这里的代码都在
PosterUtil.java
中
一、直接上代码
1. 写字方法
/**
* @return java.awt.Graphics2D
* @Author fengfanli
* @Description //TODO 在背景模板上写字,注意 需要换行算法
* @Date 9:58 2021/3/30
* @Param [bufferedImage, words, wordsFont, fontSize, wordsX, wordsY, wordsWidth, wordsHeight]
**/
public static void drawWords(BufferedImage bufferedImage, String words, Boolean isAddFontSpace, String wordsFont, int fontSize, int wordsX,
int wordsY, int wordsWidth, int wordsHeight) {
Graphics2D g2d = bufferedImage.createGraphics();
// 抗锯齿 添加文字
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); // VALUE_TEXT_ANTIALIAS_ON 改为 VALUE_TEXT_ANTIALIAS_LCD_HRGB
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.getDeviceConfiguration().createCompatibleImage(wordsWidth, wordsHeight, Transparency.TRANSLUCENT);
Font font = new Font(wordsFont, Font.BOLD, fontSize);
g2d.setFont(font);
Color color = new Color(51, 51, 51);
g2d.setColor(color);
// 换行算法
drawWordAndLineFeed(g2d, font, words, wordsX, wordsY, wordsWidth);
g2d.dispose();
}
2. 换行算法
/**
* @return void
* @Author fengfanli
* @Description //TODO 写字换行算法
* @Date 18:08 2021/4/1
* @Param []
**/
private static void drawWordAndLineFeed(Graphics2D g2d, Font font, String words, int wordsX, int wordsY, int wordsWidth) {
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
// 获取字符的最高的高度
int height = metrics.getHeight();
int width = 0;
int count = 0;
int total = words.length();
String subWords = words;
int b = 0;
for (int i = 0; i < total; i++) {
// 统计字符串宽度 并与 预设好的宽度 作比较
if (width <= wordsWidth) {
width += metrics.charWidth(words.charAt(i)); // 获取每个字符的宽度
count++;
} else {
// 画 除了最后一行的前几行
String substring = subWords.substring(0, count);
g2d.drawString(substring, wordsX, wordsY + (b * height));
subWords = subWords.substring(count);
b++;
width = 0;
count = 0;
}
// 画 最后一行字符串
if (i == total - 1) {
g2d.drawString(subWords, wordsX, wordsY + (b * height));
}
}
}
二、 叙述换行算法
通过 下面这行语句 算出 字的最大高度,和每个字符的宽度
FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
// 获取字符的最高的高度
int height = metrics.getHeight();
width = metrics.charWidth(words.charAt(0)); // 获取第一个字符的宽度
约定好 写字的 width 宽度和height 高度
然后计算每个字符的宽度相加,当大于width时,就写下来,然后换行
高度就要相加 height。
最后一行有点特殊,仔细看代码就能明白啦,需要单独拿出来进行写。