3

指定されたテキストで 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 ascent = 402 descent = 87 height = 503

「5」の正確な高さを取得する方法を知っている人はいますか? 推定身長は250前後

4

2 に答える 2

3

それはまだ少しずれていますが、はるかに近いです(288):グリフ(実際のグラフィック表現)に尋ねてください

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

他のGlyphメソッド(getGlyphVisualBounds、getGlyphPixelBounds、...)は同じ値を返します。これは、グリフが描画されたときに影響を受けるピクセルの領域であるため、より良い値のIMOを取得することはできません。

于 2010-05-21T12:09:29.200 に答える
0
FontRenderContext frc = gc.getFontRenderContext();
float textheight = (float) font.getStringBounds(comp.text, frc).getHeight();
于 2010-05-21T13:33:47.887 に答える