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

标签 java

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

我尝试以不同的方式计算正确的宽度。例如

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);

但计算出的宽度始终相同。

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;
}

计算独立于平台的必要宽度的最佳方法是什么?感谢您的帮助。

最佳答案

@MadProgrammer

谢谢指点! 这是。这两个提示必须在计算大小之前另外设置。

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);

关于java - 将文本转换为图像 - 计算精确的文本宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55756899/

相关文章:

java - 帮助我理解与Java中的HashMap相关的问题

java - 无法在 Camel HTTP 组件中配置 "Keep Alive"

java - Java 中基于枚举的表/矩阵

java - 在 JSF 中格式化日期以放入 <p :tab title =""> attribute

java - Hibernate/JPA 合并后获取数据库中具有默认值的列的值

java - 资源文件(color.xml、string.xml、style.xml)

java - Vaadin BeanFieldGroup - 绑定(bind)嵌套属性时为 "Property is not cascaded"

java - 如何在 Spring Data Rest 中添加自定义状态代码

java - Android蓝牙发现: ACTION_FOUND happening after ACTION_DISCOVERY_FINISHED

java - 在 Servlet Filter 内部调用容器的 session 对象,而不是 GemFire 的 session 对象