Java 2D PNG:计算维度

时间:2014-02-04 16:11:22

标签: java 2d bufferedimage fontmetrics

我想用Java创建一个PNG图像。在这张图片中,我想展示一些随机文字。 Normaly我会创建一个这样的图片:

BufferedImage bi = new BufferedImage(300,300,BufferedImage.TYPE_INT_ARGB);
bi.getGraphics().drawString("Hello world", 0, 0);
ImageIO.write(bi, "png", File.createTempFile("out", ".png"));

我知道我可以使用以下代码计算字符串长度:

bi.getGraphics().getFontMetrics().stringWidth("Hello world");

但要执行此操作,我需要一个图形对象(我从BufferedImage中获取)。所以我必须在使用stringWidth之前声明BufferedImage。

结果是,图像比需要的要大得多。

我看到的唯一方法是创建一个“虚拟BufferedImage”。所以我可以计算出所需的宽度和宽度。高度之后,我可以创建一个适合的BufferedImage。

我找不到更好的解决方案,但也许有人可以帮助我。

非常感谢。

1 个答案:

答案 0 :(得分:0)

抱歉,匆忙,但考虑一下这个测试:

public static void main(String[] args) {
    Font font = Font.decode(Font.MONOSPACED);

    Rectangle2D bounds;
    String str = "Hello World";

    BufferedImage dummy = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);

    FontRenderContext context = new FontRenderContext(new AffineTransform(), true, true);
    bounds = font.getStringBounds(str, context);
    System.err.println("bounds: " + bounds);

    bounds = font.getStringBounds(str, dummy.createGraphics().getFontRenderContext());
    System.err.println("bounds: " + bounds);

    Graphics2D graphics = dummy.createGraphics();
    FontMetrics fontMetrics = graphics.getFontMetrics(font);
    bounds = fontMetrics.getStringBounds(str, graphics);
    System.err.println("bounds: " + bounds);
}

输出:

bounds: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=79.21289,h=15.667969]
bounds: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=77.0,h=15.667969]
bounds: java.awt.geom.Rectangle2D$Float[x=0.0,y=-12.064453,w=77.0,h=15.667969]

因此,似乎只创建一个虚拟对象最有可能获得所需的结果(文档还指出创建FontRenderContext可能会产生意外/未定义的结果。)