java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

文章目录

前言

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

上一篇:web.xml配置文件中的async-supportedtrueasync-supported


下一篇:java-为什么Swing默认使用“ Graphics”而不是“ Graphics2D”?