c#DrawString - 测量每个字符的边界框

pow*_*tte 8 c# gdi+

在我将一个字符串传递给Graphics.DrawString()之前,我想知道每个字符的确切位置 - 不仅仅是它的偏移和宽度,而是它的上升/下降的精确边界框,以便我可以进行碰撞检测在角色级别而不是使用Graphics.MeasureString()给我的整个行高.

我似乎无法找到任何准确返回每个角色的边界框的示例.如何在c#/ GDI +中完成?

理想情况下,我想获得此图像中的每个灰色矩形:

在此输入图像描述

Jas*_*ams 3

我认为在 GDI+ 中不可能准确测量字符串中的字符。即使您忘记了子像素定位和字距调整等,这意味着绘制的字符串中的字符将根据字符串中的上下文以及屏幕上的位置和 ClearType 设置而具有不同的大小,MeasureString 习惯于添加填充和模糊因子,以便您无法轻松地从中获取所需的信息。

一种可行的方法是测量第一个字符,然后测量前两个字符,然后测量前三个字符,依此类推,这样您就可以粗略地了解在一次绘制时它们最终会出现在哪里。然后您可能需要再次测量每个字符以确定其高度。如果 MeasureString 没有给出字符高度,而是给出字体高度,则您可能必须将每个字符渲染到屏幕外位图,然后扫描像素以确定字符的真实高度。

此时,您可能会发现最好 p/调用较低级别的字体 API,它只为您直接从字体提供所需的信息。但随后您可能需要使用 GDO+ 以外的其他工具来渲染它,因为它与您所计算出的内容一致的机会可能不太好。

(你能看出我对 GDI+ 字体渲染器的质量有信任问题吗?)