我正在尝试制作一种方法,将给定的String
(和Font
)转换为BufferedImage
。但是,每次运行它时,它都会返回一个完全黑色的图像。图像的确切大小似乎是正确的,但所有像素都是完全黑色的。
以下是代码:
static final GraphicsEnvironment GE;
static
{
GE = GraphicsEnvironment.getLocalGraphicsEnvironment();
}
public static BufferedImage textToImage(String text, Font font)
{
if (font == null)
font = Font.getFont("Courier New");
FontRenderContext frc = new FontRenderContext(new AffineTransform(), false, false);
Rectangle2D bounds = font.getStringBounds(text, frc);
BufferedImage bi = new BufferedImage(
(int)(bounds.getWidth() + .5),
(int)(bounds.getHeight() + .5),
BufferedImage.TYPE_BYTE_BINARY
);
Graphics2D g = GE.createGraphics(bi);
g.setFont(font);
g.drawString(text, 0, 0);
return bi;
}
这是默认JOptionPane
字体中的“Hello World”,显示为JOptionPane
的图标:
答案 0 :(得分:1)
简单的解决方案是改变颜色......
g.setColor(Color.WHITE);
g.fillRect(0, 0, bi.getWidth(), bi.getHeight());
g.setColor(Color.BLACK);
g.setFont(font);
g.drawString(text, 0, 0);
g.dispose();
文字通常不会从y
位置向下渲染,它会从y
位置向上和向下绘制,因此您需要使用类似......
FontMetrics fm = g.getFontMetrics();
g.drawString(text, 0, fm.getAscent());
让文字正确显示......
同样font = Font.getFont("Courier New");
没有按照您的想法行事,这不会返回名为"Courier New"
的字体,而是会尝试加载名为{{1的字体文件}}
尝试使用类似......
的内容"Courier New"
,而不是...
您可能希望仔细查看Working with Text APIs以获取更多详情