为什么我的水印在java中不显示在中间?

为什么我的水印在java中不显示在中间?,java,image-processing,bufferedimage,Java,Image Processing,Bufferedimage,我阅读了许多教程,最终得到了带有徽标和文本的图像水印,但问题是,我的文本没有显示在图像的水平居中,而是文本从中心开始 这是我的密码 BufferedImage waterMark = ImageIO.read(getClass().getResource("/haams/MyLogo.png")); BufferedImage image = ImageIO.read(new File(MyImage.getAbsolutePath())); Graphics2D g = image.creat

我阅读了许多教程,最终得到了带有徽标和文本的图像水印,但问题是,我的文本没有显示在图像的水平居中,而是文本从中心开始

这是我的密码

BufferedImage waterMark = ImageIO.read(getClass().getResource("/haams/MyLogo.png"));
BufferedImage image = ImageIO.read(new File(MyImage.getAbsolutePath()));
Graphics2D g = image.createGraphics();
try 
{
   g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));// 50% transp
   g.drawImage(waterMark, image.getWidth() - waterMark.getWidth(), image.getHeight() - waterMark.getHeight(), null);// draw in lower right corner

   FontMetrics fontMetrics = g.getFontMetrics();
   Rectangle2D rect = fontMetrics.getStringBounds("Testing WaterMark", g);

   g.setFont(new Font("Arial", Font.BOLD, 30));
   g.drawString("Testing WaterMark",(image.getWidth() - (int) rect.getWidth()) / 2, (image.getHeight() - (int) rect.getHeight()) / 2);
   //Above line should place my String in center but the text starts from center
}
finally 
{
   g.dispose();
}
ImageIO.write(image, FileName.substring(FileName.lastIndexOf('.')+1),  new File(System.getProperty("user.dir")+"\\"+FileName));
在我的输出中,
MyLogo
被正确地放置在我想要的位置,但是
文本从中心开始,而不是在中心

我没有10点上传图片,所以我会尽我最大的努力来说明我的意思

我的图片和文字在里面

 -----------------------------------
 |                                  |
 |                                  |
 |                                  |
 |                                  |
 |                                  |
 |                Test WaterMark    |
 |                                  |
 |                                  |
 |                                  |
 |                                  |
 |                                  |
 -----------------------------------

您可以看到文本从中心开始,而不是居中。我的代码出了什么问题?

在我看来,问题可能是,您确实这样做了

FontMetrics fontMetrics = g.getFontMetrics();
在设置要使用的字体之前

g.setFont(new Font("Arial", Font.BOLD, 30));

确保先设置字体,然后在设置字体后获取度量值。

如果在获取字符串边界之前在图形上设置字体,会发生什么情况?我想你是在用另一种方式计算这个职位font@ToonBorgers同样的事情:(精彩的接球手,优秀的接球手。非常感谢。这就解决了问题。我会在10分钟内接受你的回答。