我需要在图像的中心写文字。要写的文字并不总是一样的。
我正在使用的代码在这里:
// 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);
问题是文字不在图像的中心,我该怎么办?
我只需要在水平中心绘制文字。
答案 0 :(得分:7)
使用JLabel
的工作量较少,但展示FontMetrics
的here可让您直接管理几何图形。
答案 1 :(得分:5)
一种可能的解决方案:在JPanel中绘制图像,确保将面板的preferredsize设置为图像的大小,让JPanel使用GridBagLayout,并将文本放在添加到JPanel的JLabel中,而不是GridBagConstraints的。这是将JLabel置于JPanel中心的一种方法。
答案 2 :(得分:5)
简单的方法是使用带有图标和文本的JLabel。然后将水平/垂直文本位置设置为CENTER,文本将绘制在图像的中心。
从您的代码中看起来您正试图在图像底部附近绘制文本。在这种情况下,您可以使用带有Icon作为容器的JLabel。然后,您可以将布局设置为类似BoxLayout的内容,并添加带有文本的另一个标签。
任何一种方法都不需要自定义绘画。
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();
}
});
}
}
我的意思是我必须在图像的中心写一个文本,然后保存图像
您可以使用Screen Image创建任何组件的图像。这假设您在GUI上显示图像和文本。
或者,如果您正在谈论只是在图像中添加文本然后保存图像,那么您将需要创建一个BufferedImage并在其上绘制图像,然后在其上绘制文本。您将需要使用Trashgod提到的FontMetrics类。我的建议无济于事。
答案 3 :(得分:2)
我使用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));