生成像素样式真实字体的位图 (Java.awt)
Generating bitmap of a pixel style true type font (Java.awt)
我有一些各种格式的老式等宽 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);
}
}
我找到了解决方案:
"I want to create the smallest possible size bitmap of the characters. (The "original" size in pixels). More accurately, the characters' smallest possible size."
"...maybe there is a way to extract the original pixel ratio of the characters from a .ttf?"
提取原始像素高度的一种方法是网站:fontdrop.info。
将 .ttf 文件拖到 select“数据”面板上。向下滚动到您会看到:
那将是(最高字形的)像素高度。
而当使用这个(16)作为font-size参数时,给了我原来的大小。
我有一些各种格式的老式等宽 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);
}
}
我找到了解决方案:
"I want to create the smallest possible size bitmap of the characters. (The "original" size in pixels). More accurately, the characters' smallest possible size."
"...maybe there is a way to extract the original pixel ratio of the characters from a .ttf?"
提取原始像素高度的一种方法是网站:fontdrop.info。
将 .ttf 文件拖到 select“数据”面板上。向下滚动到您会看到:
那将是(最高字形的)像素高度。 而当使用这个(16)作为font-size参数时,给了我原来的大小。