生成像素样式真实类型字体的位图(Java.awt)

Posted

技术标签:

【中文标题】生成像素样式真实类型字体的位图(Java.awt)【英文标题】:Generating bitmap of a pixel style true type font (Java.awt) 【发布时间】:2021-09-06 07:35:03 【问题描述】:

我有一些不同格式的老式等宽 Amiga / Atari 字体。其中有ttf。

我想创建尽可能小的字符位图。 (以像素为单位的“原始”大小)。更准确地说,是字符的最小尺寸。

所以从那里放大(我正在渲染的字符的四边形)应该保持字符像素比并保持清晰。

我可以将像素重绘为 png 并自己手动映射它们。这不会是最糟糕的。 但应该有更好的方法。我觉得 .ttf 格式并不真正适用于小像素化字体。我对其他格式不熟悉。

也许有一种方法可以从 .ttf 中提取字符的原始像素比?

我包含了一些额外上下文的代码。只是为了展示我的工作和我现在使用的课程。

创建 awt.Font。我希望“fontSize”如上所述:

InputStream stream = new FileInputStream(filePath);
Font font = Font.createFont(TRUETYPE_FONT,stream).deriveFont(PLAIN,fontSize);

从这里我创建一个临时的 BufferedImage,设置一个 Graphics2D 上下文,设置上下文的字体并派生 FontMetrics。

BufferedImage image = new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB);
Graphics2D graphics2D = image.createGraphics();
graphics2D.setFont(font);
FontMetrics metrics = graphics2D.getFontMetrics();

我使用 tmp 图像循环遍历字形以确定最终缓冲图像的宽度和高度 + 最终图像中字符的位置信息。 (代码未显示)

然后创建最终图像:

image = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
graphics2D = image.createGraphics();
graphics2D.setFont(font);
graphics2D.setColor(Color.WHITE);

        for (char i = 0; i < font.getNumGlyphs(); i++) 
            if (font.canDisplay(i)) 
                Glyph glyph = characterMap.get(i);
                glyph.calculateTextureCoordinates(width,height);
                graphics2D.drawString(Character.toString(i), glyph.x,glyph.y);
            
        

【问题讨论】:

【参考方案1】:

我找到了解决办法:

“我想创建字符的最小尺寸位图。(以像素为单位的“原始”尺寸)。更准确地说,是字符的最小尺寸。”

“...也许有一种方法可以从 .ttf 中提取字符的原始像素比?”

提取原始像素高度的一种方法是网站:fontdrop.info。

拖动 .ttf 文件并选择“数据”面板。向下滚动到你看到:

这将是像素高度(最高字形)。 而当使用这个(16)作为字体大小参数时,给了我原来的大小。

【讨论】:

以上是关于生成像素样式真实类型字体的位图(Java.awt)的主要内容,如果未能解决你的问题,请参考以下文章

java jdk-awt.font在centos上中文乱码的问题, 安装中文字体

媒体类型 & 媒体查询

LWUIT 位图字体

怎样设置label中文字的字体大小

防止 TrueType 字体的抗锯齿(或子像素渲染)

iOS使用OpenGLES和freetype绘制字体