无法在java.awt.BufferdImage / Graphics2D中获得正确的文本高度

时间:2010-05-21 10:57:08

标签: java awt graphics2d

我正在创建一个使用给定文本呈现jpg / png的s​​ervlet。我希望文本以渲染图像为中心。我可以得到宽度,但我得到的高度似乎是错误的

Font myfont = new Font(Font.SANS_SERIF, Font.BOLD, 400);

BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.setFont(myfont);
g.setColor(Color.BLACK);

FontMetrics fm = g.getFontMetrics();
Integer textwidth = fm.stringWidth(imagetext);
Integer textheight = fm.getHeight();

FontRenderContext fr = g.getFontRenderContext();
LineMetrics lm = myfont.getLineMetrics("5", fr );

float ascent = lm.getAscent();
float descent = lm.getDescent();
float height = lm.getHeight();

g.drawString("5", ((imagewidth - textwidth) / 2) , y?);
g.dispose();    

ImageIO.write(image, "png", outputstream);

这些是我得到的值: textwidth = 222 textheight = 504 上升= 402 下降= 87 身高= 503

任何人都知道如何获得“5”的确切高度?估计的高度应该是大约250

2 个答案:

答案 0 :(得分:3)

它仍然有点偏离,但更接近(288):问雕文(实际的图形表示)

GlyphVector gv = myfont.createGlyphVector(fr, "5");
Rectangle2D bounds = gv.getGlyphMetrics(0).getBounds2D();
float height = bounds.height();

其他Glyph方法(getGlyphVisualBounds,getGlyphPixelBounds,...)返回相同的值。这是绘制字形时受影响像素的区域,因此您无法获得更好的IMO值

答案 1 :(得分:0)

FontRenderContext frc = gc.getFontRenderContext();
float textheight = (float) font.getStringBounds(comp.text, frc).getHeight();