确定用于呈现文本的字符的 y 位置

Determining the y placement of a character for rendering text

本文关键字:字符 位置 文本 用于      更新时间:2023-10-16

我一直在开发自己的位图字体渲染器,虽然我相信我可能有正确的字符间距,但我不确定如何确定字符的 y 位置。例如,如果字母"a"的y位置为0,那么"*"或","会有什么?我一直在使用 winapi 函数GetCharABCWidthsFloatW来确定字符之间的间距,是否有其他函数可用于确定某种 y 偏移量?

我正在对我的位图图像进行最佳调整,因此它们的大小并不总是相同的。

每个字符本身应该在 y 方向上被正确的文本渲染 API 偏移(TextOutDrawText 等),因此您应该有一个常量偏移量。我总是使用 GetTextExtentPoint32 获取字符串"Ag"的指标来获取一般指标,此外您可以尝试 GetTextMetrics。

GetTextMetrics是正确的答案。但是 demorge 可能想说,你需要用于 Y 坐标的字段是 tmAscent(看看结构)。

总高度为 tmHeight。tmAscent 是从顶部到基线的距离。tmDescent是基线和字体底部之间的距离。

因此,在大多数情况下,如果您(x,y)坐标引用文本的左上角,则要添加tmAscent。如果 y 坐标是底部,则减去 tmDescent(+ 或 - 也取决于你是否反转了视口,但你可以测试看看你得到了什么。

无论您写"a"、"*"还是"j",该信息都有效。所有字符的基线都相同。

如果我理解正确:每个字形的位图最初高度相同。 然后,修剪每个字形周围的所有空闲空间,为每个字符创建最小的位图。

在这种情况下,答案很简单。 创建裁切位图时,请记住从左侧和顶部(或左侧和底部,具体取决于字形的定位方式)删除了多少像素。 绘制位图时,可以使用保存的值调整坐标。

但是,如果您尝试使用字体指标来确定要从每个位图中修剪多少,则无法。

一般字体信息:

您正在寻找的是如何将文本放置规范化为"基线"或"原点"(相同的概念)。 您可以使用上升(上升)或下降(下降)来执行此操作,具体取决于您的坐标系。

http://www.freetype.org/freetype2/docs/tutorial/step2.html

这提供了一组与排版相关的很好的示例图像。

常规位图字体信息:

现在,对于位图

图像,确保它们正确排列的最简单方法是在精灵表中为每个角色的位图表示具有相同的高度(宽度应该不同,但基于实际字符宽度)。 如果您这样做,那么您可以简单地根据共享高度将所有内容排列在一起。

但是,如果要剪裁

字符周围的多余空格,则需要将剪裁的值与字形一起存储在某个结构中,以便确定偏移量。 如果 API 正在为您执行此操作,他们可能会使用升序/降序、原点/基线或线高类型方法,您可以在其中根据字符获取完整尺寸,以便正确执行此操作。

API 特定信息
编辑:根据其他答案,以下是您的API特定问题的相关链接:

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

文本度量结构:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

tmAscent 或 tmDescent 可用于帮助偏移 y 坐标。