【问题标题】:Can't render unicode characters with Graphics2D even though they are supported by the font即使字体支持,也无法使用 Graphics2D 呈现 unicode 字符
【发布时间】: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

这是我的结果

Result

我想我通常使用所有其他字体获得四边形。 它编译并将结果保存在 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


【解决方案1】:

我是个白痴……有时我想知道我是如何度过这一天而不意外被杀的……

如果您无法正确使用 unicode 字符串,并且即使在与 Google 争吵 2 天后也找不到答案,请检查源文件的编码...我的设置为 Windows-1252...

【讨论】:

  • 我清楚地记得问过你的文件是否编码为 utf8,你说是 ;)
  • @Mike'Pomax'Kamermans 我认为这是因为当我保存文件时,当我再次打开它时仍然有变音符号。也很晚了,所以我并没有真正考虑过正确检查:(你想把它写成一个正确的答案以便我接受吗?
猜你喜欢
  • 2013-08-06
  • 2016-09-13
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
  • 2017-12-13
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多