Невозможно получить правильную высоту текста в java.awt.BufferdImage/Graphics2D
Я создаю сервлет, который отображает JPG / PNG с заданным текстом. Я хочу, чтобы текст был в центре отрисованного изображения. Я могу получить ширину, но высота, которую я получаю, кажется неправильной
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 ответа
Решение
Это все еще немного, но намного ближе (288): спросите Glyph (фактическое графическое представление)
GlyphVector gv = myfont.createGlyphVector(fr, "5");
Rectangle2D bounds = gv.getGlyphMetrics(0).getBounds2D();
float height = bounds.height();
Другие методы Glyph (getGlyphVisualBounds, getGlyphPixelBounds, ...) возвращают то же значение. Это область затронутых пикселей при отрисовке глифа, поэтому вы не получите лучшего значения IMO
FontRenderContext frc = gc.getFontRenderContext();
float textheight = (float) font.getStringBounds(comp.text, frc).getHeight();