简体   繁体   English

Java - 在图像的中心绘制文本

[英]Java - Draw text in the center of an image

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. 我只需要在水平中心绘制文字。

使用JLabel的工作量较少,但此处显示的FontMetrics将允许您直接管理几何体。

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. 一种可能的解决方案:在JPanel中绘制图像,确保将面板的preferredsize设置为图像的大小,让JPanel使用GridBagLayout,并将文本放在添加到JPanel的JLabel中,而不使用GridBagConstraints。 This is one way to center the JLabel in the JPanel. 这是将JLabel置于JPanel中心的一种方法。

The easy way is to use a JLabel with an Icon and Text. 简单的方法是使用带有图标和文本的JLabel。 Then set the horizontal/vertical text position to CENTER and the text is painted in the center of the image. 然后将水平/垂直文本位置设置为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. 在这种情况下,您可以使用带有Icon作为容器的JLabel。 Then you can set the layout to something like a BoxLayout and add another label with the text. 然后,您可以将布局设置为类似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 Image to 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. 或者,如果您只是在读取图像中添加文本然后保存图像,那么您将需要创建一个BufferedImage并在其上绘制图像,然后在其上绘制文本。 You will need to use the FontMetrics class as mentioned by Trashgod. 您将需要使用Trashgod提到的FontMetrics类。 My suggestion won't help. 我的建议无济于事。

I used TextLayout to get the text properly centered: 我使用TextLayout来使文本正确居中:

生成图像的示例

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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM