【问题标题】:Java - Draw text in the center of an imageJava - 在图像的中心绘制文本
【发布时间】:2011-09-06 17:06:09
【问题描述】:

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

我使用的代码在这里:

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

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

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

【问题讨论】:

    标签: java swing graphics graphics2d imageicon


    【解决方案1】:

    使用JLabel 的工作量较少,但FontMetrics 显示为here,可以让您直接管理几何图形。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我会尝试这种方式。谢谢。
      • 但是这样我无法保存图像,我的意思是如果我保存图像,文本将不会被保存。我也在寻找一种保存文本的方法。我的意思是我必须在图像的中心写一个文本,然后保存图像。
      【解决方案3】:

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

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

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

      import java.awt.*;
      import javax.swing.*;
      import javax.swing.text.*;
      
      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) );
      
              //
      
              JLabel label3 = new JLabel( new ColorIcon(Color.GREEN, 200, 150) );
              add( label3 );
      
              JLabel text3 = new JLabel();
              text3.setText("<html><center>Text<br>over<br>Image<center></html>");
              text3.setLocation(20, 20);
              text3.setSize(text3.getPreferredSize());
              label3.add( text3 );
      
              //
      
              JLabel label4 = new JLabel( new ColorIcon(Color.CYAN, 200, 150) );
              add( label4 );
      
              JTextPane textPane = new JTextPane();
              textPane.setText("Add some text that will wrap at your preferred width");
              textPane.setEditable( false );
              textPane.setOpaque(false);
              SimpleAttributeSet center = new SimpleAttributeSet();
              StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
              StyledDocument doc = textPane.getStyledDocument();
              doc.setParagraphAttributes(0, doc.getLength(), center, false);
              textPane.setBounds(20, 20, 75, 100);
              label4.add( textPane );
          }
      
          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();
                  }
              });
          }
      }
      

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

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

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

      【讨论】:

      • 我将使用 FontMetrics 类,因为我需要保存图像但我也在使用 GUI,我可以使用你的建议吗?
      • +1 ScreenImage;另见ImageIOexample.
      • @GhzNcl,我不明白你的问题。我给了你工作代码。只有你可以决定它是否做你想做的事。我还提供了一个 ScreenImage 链接,它展示了如何在可见或不可见组件上使用它。
      【解决方案4】:

      我使用TextLayout 使文本正确居中:

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

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

      【讨论】:

        猜你喜欢
        • 2021-12-26
        • 2013-07-19
        • 1970-01-01
        • 2017-07-07
        • 2021-04-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多