文字换行算法详解
,传送门:头像切割成圆形方法详解
,传送门:获取微信二维码详情
,传送门:java BufferedImage 转 InputStream
,传送门:png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
,传送门:java 整合echarts 画出 折线图
,传送门:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
,传送门:项目部署到linux下中文不显示,echarts图上的中文也不显示问题
,传送门:PosterUtil.java
中/** * @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(); }
/** * @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。
最后一行有点特殊,仔细看代码就能明白啦,需要单独拿出来进行写。