Java - 在图像中心绘制文本

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7323538/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 19:32:16  来源:igfitidea点击:

Java - Draw text in the center of an image

javaswinggraphicsgraphics2dimageicon

提问by GhzNcl

I need to write text in the center of an image. The text to write is not always the same.

我需要在图像的中心写文字。要编写的文本并不总是相同的。

The code I'm using is here:

我正在使用的代码在这里:

// Here I first draw the image
g.drawImage(img, 22, 15, 280, 225, null);
// I get the text 
String text = photoText.getText();
// Set the text color to black
g.setColor(Color.black);
// I draw the string 
g.drawString(text, 79.5F, 220.0F);

The problem is that the text isn't at the center of the image, what can I do?

问题是文字不在图像的中心,我该怎么办?

I only need to draw the text at the horizontal center.

我只需要在水平中心绘制文本。

回答by trashgod

Using a JLabelis less work, but FontMetrics, shown here, will let you manage the geometry directly.

使用JLabel较少的工作,但是FontMetrics,显示在这里,将让您直接管理的几何形状。

回答by camickr

The easy way is to use a JLabel with an Icon and Text. Then set the horizontal/vertical text position to CENTER and the text is painted in the center of the image.

简单的方法是使用带有图标和文本的 JLabel。然后将水平/垂直文本位置设置为 CENTER,文本绘制在图像的中心。

From your code it looks like you are trying to paint the text near the bottom of the image. In this case you can use the JLabel with an Icon as a container. Then you can set the layout to something like a BoxLayout and add another label with the text.

从您的代码看来,您正在尝试在图像底部附近绘制文本。在这种情况下,您可以使用带有 Icon 的 JLabel 作为容器。然后,您可以将布局设置为 BoxLayout 之类的内容,并添加另一个带有文本的标签。

No custom painting is required for either approach.

两种方法都不需要自定义绘画。

import java.awt.*;
import javax.swing.*;

public class LabelImageText extends JPanel
{
    public LabelImageText()
    {
        JLabel label1 = new JLabel( new ColorIcon(Color.ORANGE, 100, 100) );
        label1.setText( "Easy Way" );
        label1.setHorizontalTextPosition(JLabel.CENTER);
        label1.setVerticalTextPosition(JLabel.CENTER);
        add( label1 );

        JLabel label2 = new JLabel( new ColorIcon(Color.YELLOW, 200, 150) );
        label2.setLayout( new BoxLayout(label2, BoxLayout.Y_AXIS) );
        add( label2 );

        JLabel text = new JLabel( "More Control" );
        text.setAlignmentX(JLabel.CENTER_ALIGNMENT);
        label2.add( Box.createVerticalGlue() );
        label2.add( text );
        label2.add( Box.createVerticalStrut(10) );
    }


    public static class ColorIcon implements Icon
    {
        private Color color;
        private int width;
        private int height;

        public ColorIcon(Color color, int width, int height)
        {
            this.color = color;
            this.width = width;
            this.height = height;
        }

        public int getIconWidth()
        {
            return width;
        }

        public int getIconHeight()
        {
            return height;
        }

        public void paintIcon(Component c, Graphics g, int x, int y)
        {
            g.setColor(color);
            g.fillRect(x, y, width, height);
        }
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("LabelImageText");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new LabelImageText() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}

I mean I have to write a text in the center of the image and then save the image

我的意思是我必须在图像的中心写一个文本,然后保存图像

You can use Screen Imageto create an image of any component. This assumes you are displaying the image and text on a GUI.

您可以使用屏幕图像来创建任何组件的图像。这假设您在 GUI 上显示图像和文本。

Or, if you are talking about just reading in an image adding text to the image and then saving the image, then you will need to create a BufferedImage and draw the image on it and then draw the text on it. You will need to use the FontMetrics class as mentioned by Trashgod. My suggestion won't help.

或者,如果您只是在读取图像,将文本添加到图像然后保存图像,那么您将需要创建一个 BufferedImage 并在其上绘制图像,然后在其上绘制文本。您将需要使用 Trashgod 提到的 FontMetrics 类。我的建议无济于事。

回答by Hovercraft Full Of Eels

One possible solution: draw the image in a JPanel, being sure to set the panel's preferredsize as the size of the image, have the JPanel use a GridBagLayout, and place the text in a JLabel that is added to the JPanel, without GridBagConstraints. This is one way to center the JLabel in the JPanel.

一种可能的解决方案:在 JPanel 中绘制图像,确保将面板的首选大小设置为图像的大小,让 JPanel 使用 GridBagLayout,并将文本放置在添加到 JPanel 的 JLabel 中,没有 GridBagConstraints。这是在 JPanel 中将 JLabel 居中的一种方法。

回答by Matthias Braun

I used TextLayoutto get the text properly centered:

我曾经TextLayout让文本正确居中:

example of generated image

生成图像的例子

Here's how to create and save the image to file:

以下是创建图像并将其保存到文件的方法:

int imgWidth = 250;
int imgHeight = 250;
BufferedImage img = new BufferedImage(imgWidth, imgHeight,
        BufferedImage.TYPE_INT_RGB);

Graphics2D g = img.createGraphics();

Color backgroundColor = new Color(0, 150, 100);
g.setPaint(backgroundColor);
g.fillRect(0, 0, imgWidth, imgHeight);

Font font = new Font("Arial", Font.PLAIN, 80);
g.setFont(font);
g.setPaint(Color.WHITE);

String text = "0";

TextLayout textLayout = new TextLayout(text, g.getFont(),
        g.getFontRenderContext());
double textHeight = textLayout.getBounds().getHeight();
double textWidth = textLayout.getBounds().getWidth();

g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
        RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

// Draw the text in the center of the image
g.drawString(text, imgWidth / 2 - (int) textWidth / 2,
                   imgHeight / 2 + (int) textHeight / 2);

String imgFormat = "png";
ImageIO.write(img, imgFormat, new File("/home/me/new_image." + imgFormat));