我有一个图像,我希望在其上面写有多行,中心对齐和动态(可变宽度)的文本。我已尝试使用drawString
中的Graphics
方法,但我无法使中心和动态定位起作用。我目前正在使用swing
这样的JLabels
库中闲聊,但我很难找到相对简单的方法。我还希望将最终图像写入文件,但似乎将ImageIO
与JPanel
混合使用效果不佳..我只是在一个黑盒子里面时刻..如果有人能提供一个如何处理这个的简单概述,我将非常感激。
谢谢!
对不起,我应该更具体一点..我希望文本本身是中心对齐的(因为在每行的中间应该对齐),而不是将文本放在图像的中心。文本将放置在图像上的其他位置,而不是中间。我再次为不清楚的描述道歉。谢谢!
答案 0 :(得分:8)
如果你只是想生成图像文件,你根本不需要摆动。
您可以这样做:
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;
BufferedImage img = ImageIO.read(new File("dog.jpg")); // try/catch IOException
int width = img.getWidth();
int height = img.getHeight();
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bufferedImage.createGraphics();
// draw graphics
g2d.drawImage(img, 0, 0, null);
g2d.drawString(text, x, y);
g2d.dispose();
try {
// Save as PNG
File file = new File("newimage.png");
ImageIO.write(bufferedImage, "png", file);
// Save as JPEG
file = new File("newimage.jpg");
ImageIO.write(bufferedImage, "jpg", file);
} catch (IOException e) { }
有关详细信息,请参阅:
http://www.exampledepot.com/egs/javax.imageio/Graphic2File.html
可以使用FontMetrics类完成文本对齐和居中。
答案 1 :(得分:2)
您应该使用drawString()
。
要正确居中文本,您需要计算给定字体的宽度:
Font font = getFont();
FontMetrics metrics = getFontMetrics( font );
int width = metrics.stringWidth( theString );
如果你想在服务器上调用(没有GUI),请记得添加-Djava.awt.headless=true
。
答案 2 :(得分:2)
使用JLabel显示图像和文字:
JLabel picture = new JLabel( new ImageIcon(...) );
picture.setText("<html><center>Text<br>over<br>Image<center></html>");
picture.setHorizontalTextPosition(JLabel.CENTER);
picture.setVerticalTextPosition(JLabel.CENTER);
然后,您可以使用Screen Image类创建任何组件的图像。
编辑:
错过了您不希望文本以图片为中心的更新。对于新要求,您可以在标签中添加其他组件以进行格式化。下面的代码显示了原始建议以及使用组件的一些示例:
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();
}
});
}
}