5

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

我的位图图像最适合我,所以它们的大小并不总是相同。

4

4 回答 4

0

每个字符本身都应该通过文本呈现 API 正确地在 y 方向偏移(TextOutDrawText等),因此您应该有一个恒定的偏移量。我总是使用字符串“Ag”GetTextExtentPoint32的指标来获取一般指标,此外您可以尝试GetTextMetrics

于 2012-05-24T07:29:36.387 回答
0

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

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

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

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

于 2012-05-28T03:08:02.633 回答
0

一般字体信息:

您正在寻找的是如何将文本放置标准化为“基线”或“原点”(相同的概念)。您可以根据您的坐标系使用上升(上升)或下降(下降)来执行此操作。

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

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

一般位图字体信息:

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

但是,如果要剪裁字符周围多余的空白,则需要将剪裁的值与字形一起存储在某些结构中,以便确定偏移量。如果 API 为您执行此操作,则它们可能具有上升/下降、原点/基线或行高类型的方法,您可以在其中基于字符获取完整尺寸,以便正确执行此操作。

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

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

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

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

于 2012-05-30T18:17:58.440 回答
0

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

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

但是,如果您尝试使用字体度量来确定从每个位图中修剪多少,则不能。

于 2012-05-28T16:34:42.820 回答