Java解析truetype字体以将每个字符提取为图像及其代码

Posted

技术标签:

【中文标题】Java解析truetype字体以将每个字符提取为图像及其代码【英文标题】:Java parsing truetype font to extract each characters as image & its code 【发布时间】:2013-06-21 08:58:52 【问题描述】:

是否有任何 java 库可用于从真字体 (.ttf) 中提取每个字符?

字体的每个字符,我都想:

    转换成图片 提取其代码(例如:Unicode 值)

任何人都可以帮助向我展示一些关于上述目的的提示吗?

P.S:我想弄清楚,这个应用程序是如何制作的:http://www.softpedia.com/progScreenshots/CharMap-Screenshot-94863.html

【问题讨论】:

我不认为它将字符转换为图像,应用程序只是使用所选字体将每个字符写入不同标签中 是的,我的目的是将字符转换为图像,但我想知道如何从字体中获取每个字符?我们可以将每个字符提取到位图文件吗? 正如我所说,他们不太可能将字符转换为图像,这是一种内存浪费,他们当然只是将每个字符打印到正确的标签上,将其转换为图像会减少应用程序性能和浪费内存 @BackSlash 是的,我知道,但我说过我的目的是要获得角色的每一个设计,我不喜欢它们,我有这个目的。所以我想知道我们是否可以从字体(设计属性)及其代码中提取每个字符。 【参考方案1】:

这会将String 转换为BufferedImage

public BufferedImage stringToBufferedImage(String s) 
    //First, we have to calculate the string's width and height

    BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR);
    Graphics g = img.getGraphics();

    //Set the font to be used when drawing the string
    Font f = new Font("Tahoma", Font.PLAIN, 48);
    g.setFont(f);

    //Get the string visual bounds
    FontRenderContext frc = g.getFontMetrics().getFontRenderContext();
    Rectangle2D rect = f.getStringBounds(s, frc);
    //Release resources
    g.dispose();

    //Then, we have to draw the string on the final image

    //Create a new image where to print the character
    img = new BufferedImage((int) Math.ceil(rect.getWidth()), (int) Math.ceil(rect.getHeight()), BufferedImage.TYPE_4BYTE_ABGR);
    g = img.getGraphics();
    g.setColor(Color.black); //Otherwise the text would be white
    g.setFont(f);

    //Calculate x and y for that string
    FontMetrics fm = g.getFontMetrics();
    int x = 0;
    int y = fm.getAscent(); //getAscent() = baseline
    g.drawString(s, x, y);

    //Release resources
    g.dispose();

    //Return the image
    return img;

我认为没有办法获取所有字符,您必须创建一个 Stringchar 数组来存储要转换为图像的所有字符。

一旦你有了Stringchar[] 以及你想要转换的所有键,你就可以轻松地遍历它并调用stringToBufferedImage 方法进行转换,然后你就可以做

int charCode = (int) charactersMap.charAt(counter);

如果charactersMapString,或者

int charCode = (int) charactersMap[counter];

如果charactersMapchar 数组

希望对你有帮助

【讨论】:

谢谢,它也适用于高棉 unicode。 BufferedImage img = stringToBufferedImage("ក"); System.out.println(img);文件输出文件 = new File("c:/tmp/saved.png"); ImageIO.write(img, "png", outputfile); 我正在测试 fontbox 库,看看它是否可以从字体中提取所有字符。目前我可以提取每个字符的后记名称/unicode值 这个解决方案更有可能对我有所帮助,当然直接从 truetype 字体工作又是另一个挑战,但我仍然使用 fontbox 读取每个 unicode 字符串并转换为相应的字符,我会这样做.感谢上述解决方案。 我有一个关于如何保持 32x32 像素的输出图像数据的问题?由于某些字符具有给定的字体大小,它们会生成不同大小的图片吗?

以上是关于Java解析truetype字体以将每个字符提取为图像及其代码的主要内容,如果未能解决你的问题,请参考以下文章

TrueType字体文件提取关键信息

TrueType字体文件提取关键信息

计算字体 truetype hhea 值(上升、下降)

AD中怎么将字体stroke全部改为truetype?

使用 javafx 创建 Truetype 字体文件

字体truetype postscript opentype