繁体   English   中英

C#绘制字符串像素完美

[英]C# draw a string pixel perfect

我正在尝试使用textrenderer.drawtext,graphics.drawstring或graphicspath.addstring绘制字符串-主要目的是将所有字体提取到位图以进行编辑,并将它们用作游戏中的着色器。

使用textrenderer.drawtext和graphics.drawstring,我得到了不同程度的填充-因此我尝试了graphicspath.addstring。 我提取了字体家族的上升高度和下降高度,但是它们与emheight完全不可用。 (微软建议您使用上升和下降来实现自己的目标-通过http://msdn.microsoft.com/zh-cn/library/xwf9s90b%28v=vs.110%29.aspx进行操作 。有没有人成功地使用C#绘制出像素完美的字体?每当我尝试或查找它时,textrenderer和图形总是'填充'总是使图形搞砸,而这种新的graphicspath方法似乎在使用特定比例尺时存在问题。

使用TextRendererMeasureString的常用方法将为您提供SizeF ,其中包含您测量的字符串的边界。 大多数格式都有些懈怠,因此您可以通过将字符串添加在一起来撰写文本。

这些方法的目的是通过让您测量一行何时填充或下一行前进多少像素来帮助创建文本块。

它们并不是真正用于测量单个字符。

为此,有一个特殊的字符串格式GenericTypographic ,如此处所述它保留了空白。

为了获得更精确的测量结果,可以在关闭抗锯齿之后使用GraphicsPath.AddString然后使用GetBounds

现在,如果您想精确地绘制单个字符,比如说以Button为中心,就可以完成任务。

但是您知道所有这些并且您的目标是不同的-如果我理解您的话,您想从每个字符创建位图,以便以后将它们合并成文本。 这意味着您需要它们垂直正确对齐,即位于同一基线上。

字符的大小对您没有帮助; 现在,通常您需要每个字符的基线,而您不会得到这些基线,至少不需要像“ f”或什至只是“,”等下降的字符。

但这也无济于事,因为在GDI中,您始终不会打印/绘制到基线。

您应该执行的操作是,imo要么绘制一个包含所有字符的长字符串,以使它们全部正确对齐,然后一一切出字符。 或者,您可以自己绘制每个字符,但后缀所有您知道具有升序和降序的字符,然后仅从结果中选择第一列。

因此,我弄清楚该方法的唯一方法是先将字符串绘制到图形路径,然后测量图形路径中的所有空白点,然后在测量完每个点后才获取高度,然后重新绘制字符串(我有一个尝试计数器,可以限制尝试次数,但可以提高em的像素精度),使用修饰符将旧尺寸和新尺寸考虑在内,然后提取最终尺寸并将其存储。

只有这样,我才能绕过每种字体的BS,它具有与之无关的奇怪的顶部填充,它的上升和内部溢出(例如:Ñ)以及下降(以这种方式表示的0,0点)没有关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM