确定用于呈现文本的字符的 y 位置
Determining the y placement of a character for rendering text
我一直在开发自己的位图字体渲染器,虽然我相信我可能有正确的字符间距,但我不确定如何确定字符的 y 位置。例如,如果字母"a"的y位置为0,那么"*"或","会有什么?我一直在使用 winapi 函数GetCharABCWidthsFloatW
来确定字符之间的间距,是否有其他函数可用于确定某种 y 偏移量?
我正在对我的位图图像进行最佳调整,因此它们的大小并不总是相同的。
每个字符本身应该在 y 方向上被正确的文本渲染 API 偏移(TextOut
、DrawText
等),因此您应该有一个常量偏移量。我总是使用 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 坐标。
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- C++指针数组到字符数组中的特定位置
- 计算在同一位置至少包含一个常用字符的不同字符串对
- 我如何知道字符串中字符相对于英文字母的位置值?
- 我正在尝试为字符打印一些相应的值,但条件总是转到其他位置
- 递增 'int i = 0' 以在初始化的字符数组的位置递增
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- 如何计算 3d 数组中的索引值在内存中的位置?如何计算字符**中的索引值在内存中的位置?
- 如何从输入字符串中提取特定位置的字符?
- 如何在 Clang AST 中的源位置之后找到字符的源位置?
- 从输入 1 查找输入 2 中字符的位置
- 为字符串中的每个字符(不是字符位置!)分配唯一的索引
- 提取字符后返回到文件中的特定位置
- 从文件对象的当前位置删除字符
- 访问字符阵列中不可用的内存位置(超出范围值)
- 使用指针在字符串中获取字符的位置
- 如何使用 antlr4 恢复特定行和字符位置的 ParserRuleContext
- 创建一个从前缀到C 中字符位置的新字符串
- c++字符串交换字符位置
- 从文本控件中检索字符位置的客户端区域坐标