我尝试将文本呈现给BufferedImage并且效果非常好,但是我无法渲染任何非ASCII字符(至少就我所见)。我所能找到的只是因为字体,所以我下载了Google的“Noto”字体,似乎支持字面上的每个脚本,但我仍然得到了这些框。
我甚至没有尝试渲染特别异国情调的东西。只有德国的变音符号和尖锐的s(ÄäÖöÜüß)。
我创建了这样的字体
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(12f);
渲染像这样的整个事情
Graphics2D g2 = image.createGraphics();
g2.setFont(font);
g2.setColor(Color.white);
g2.drawString(string, 0, g2.getFontMetrics().getAscent());
g2.dispose();
适用于ASCII。
Google或者引导我学习非常简单的教程(实际上是我目前得到的代码),或者说问题是字体,但它不是因为它在编辑器中完美运行。
由于
Edit1 :这是我的完整代码
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException, FontFormatException {
String string = "ÄäÖöÜüß";
BufferedImage image;
Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("NotoSans-Regular.ttf")).deriveFont(50f);
Rectangle2D rec = font.getStringBounds(string, new FontRenderContext(null, false, false));
image = new BufferedImage((int)rec.getWidth(), (int)rec.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
g2.setFont(font);
g2.setColor(Color.white);
g2.drawString(string, 0, g2.getFontMetrics().getAscent());
g2.dispose();
File f = new File("image.png");
if (!f.exists()) {
if (!f.createNewFile()) {
System.err.println("Can't create image file.");
}
}
ImageIO.write(image, "png", f);
}
}
可以下载字体here from google
这是我的结果
我认为我通常使用所有其他字体的四边形。 它将结果编译并保存在PNG中。
它适用于ASCII字符。
很抱歉没有使用正确的图片,但如果没有至少10个声誉,我就无法做到。
Edit2 :它现在可以使用,但不能在我的电脑上使用。如果我重新编译,它可以在Linux上运行,但是......
Edit3 :与最新的JDK相同。
答案 0 :(得分:4)
我是个白痴......有时候我想知道如何度过这一天并且不小心让自己被杀......
如果您无法正确使用unicode字符串,即使在与Google斗争2天后也找不到答案,请检查源文件的编码...我的设置为Windows-1252 ...