首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文本转换为图像-计算精确的文本宽度

将文本转换为图像-计算精确的文本宽度
EN

Stack Overflow用户
提问于 2019-04-19 13:11:28
回答 1查看 27关注 0票数 1

我需要将文本转换为图像。我在另一个线程中发现了一些代码,我对其进行了一些修改。本地的一切都运行得很好。文本恰好在图像的末尾结束。但在服务器(运行openJDK)上,并非整个文本都可见(缺少2.5个字母)。

我试着用不同的方法计算正确的宽度。例如:

代码语言:javascript
复制
FontRenderContext frc = g2d.getFontRenderContext();
Rectangle2D r2d = font.getStringBounds(row, frc);
int width = (int)Math.ceil(r2d.getWidth());

int width = g2d.getFontMetrics(g2d.getFont()).stringWidth(row);

但是计算出来的宽度总是一样的。

代码语言:javascript
复制
public static BufferedImage text2Image(Font font, Color textColor, Color backgroundColor, String...textRows) {
    BufferedImage helperImg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
    Graphics2D g2d = helperImg.createGraphics();

    g2d.setFont(font);
    FontMetrics fm = g2d.getFontMetrics();

    int width = 0;
    for(String row : textRows) {
        if(fm.stringWidth(row) > width) {
            width = fm.stringWidth(row);
        }
    }
    int height = fm.getHeight() * textRows.length;
    g2d.dispose();

    BufferedImage finalImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    g2d = finalImg.createGraphics();
    g2d.setColor(backgroundColor);
    g2d.fillRect(0, 0, width, height);
    g2d.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
    g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
    g2d.setFont(font);
    fm = g2d.getFontMetrics();
    g2d.setColor(textColor);
    int y = fm.getAscent();
    for(String row : textRows) {
        g2d.drawString(row, 0, y);
        y += fm.getHeight();
    }
    g2d.dispose();

    return finalImg;
}

计算与平台无关的存储器宽度的最好方法是什么?谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2019-04-19 14:38:29

@MadProgrammer

谢谢你的提示!就是这样。在计算大小之前,必须另外设置这两个提示。

代码语言:javascript
复制
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55756899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档