即使字体支持,也无法使用 Graphics2D 呈现 unicode 字符
Can't render unicode characters with Graphics2D even though they are supported by the font
我尝试将文本呈现为 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.
我是个白痴...有时我想知道我是如何度过这一天而不会意外杀死自己的...
如果你无法正确使用unicode字符串,并且在与Google战斗了2天后仍找不到答案,请检查你的源文件的编码...我的设置为Windows-1252...
我尝试将文本呈现为 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.
我是个白痴...有时我想知道我是如何度过这一天而不会意外杀死自己的...
如果你无法正确使用unicode字符串,并且在与Google战斗了2天后仍找不到答案,请检查你的源文件的编码...我的设置为Windows-1252...