【发布时间】:2015-07-17 09:35:23
【问题描述】:
我尝试将文本渲染到 BufferedImage 并且效果非常好,但我无法渲染任何非 ASCII 字符(至少据我所知)。我所能找到的只是因为字体,所以我下载了谷歌的“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:现在可以使用,但不能在我的 PC 上使用。如果我重新编译,它可以在 Linux 上运行...
Edit3:与最新的 JDK 相同。
【问题讨论】:
-
根据我有限的测试,字体不会产生任何输出。如果我使用标准字体(Tahoma),它可以正常工作
-
image是什么?string是什么?你的文件是 utf-8 编码的吗?您是否尝试过使用纯数字而不是g2.getFontMetrics().getAscent()? (g2.getFontMetrics().getAscent()是否与 Noto Sans 上升值所说的相符?)。许多问题需要解答。 -
为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)或SSCCE(简短、独立、正确示例)。另见Setting custom font & Getting fonts, sizes, bold,…etc。
-
@MadProgrammer 我只得到 Tahoma 的空方块
-
@Mike'Pomax'Kamermans 我现在发布了一个工作示例。 image 是我保存在文件中并写入的 BufferedImage,string 是应该渲染的 String,Font 是 unicode 编码的。是的,你的所有其他问题。
标签: java unicode fonts awt graphics2d