TextRenderer:如何像在具有不同 Dpi 的机器上一样测量文本?

Posted

技术标签:

【中文标题】TextRenderer:如何像在具有不同 Dpi 的机器上一样测量文本?【英文标题】:TextRenderer: How to measure text as if it was on machine with different Dpi? 【发布时间】:2015-01-17 00:06:08 【问题描述】:

我有一个由服务器端和客户端组成的 C# WinForms 应用程序。我使用TextRenderer.MeasureText(string text, Font font) 方法来测量文本。

有时我需要在服务器端测量文本,就好像它在客户端一样。我将 Graphics.DpiX 和 Graphics.DpiY 值从客户端发送到服务器。基于这些值,我如何在服务器端测量文本?关键是客户端和服务器 Dpi 可能不同。

我想,我可以以某种方式从 Dpi 值创建 Graphics 对象并使用 TextRenderer.MeasureText(IDeviceContext dc, string text, Font font) 重载来测量我的文本。但是如何仅从 DpiX 和 DpiY 值创建Graphics

【问题讨论】:

使用您调用 SetResolution() 的虚拟位图,使用 Graphics.FromImage() 创建 Graphics 对象。 @Hans,如果我使用这种方式,Graphics 对象的MeasureString(string text, Font font) 方法会返回正确的值,但TextRenderer 似乎没有将Graphics.DpiXGraphics.DpiY 值带入帐户。任何想法,为什么会发生这种情况?我不想使用Graphics.MeasureString(string text, Font font) 方法,因为我知道它可能不准确。 我复制。这太令人惊讶了:)我对这种行为没有一个好的理论。 @Hans,使用Graphics.MeasureString(string text, Font font) 怎么样?是不是太糟糕了? 嗯,它确实关注 DPI,但其他代码使用 Graphics.DrawString() 非常重要。它很少这样做,GDI+ 文本渲染非常糟糕。 【参考方案1】:

您可以试试这个技巧:将变换应用到您要测量的字体大小:在 120dpi 上使用 12pt 字体绘制与在 96 上使用 12*120/96=15 绘制的像素数相同dpi。

【讨论】:

以上是关于TextRenderer:如何像在具有不同 Dpi 的机器上一样测量文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 TextRenderer 绘制多种大小的文本对齐? [复制]

如何配置应用程序以在具有高 DPI 设置(例如 150%)的机器上正确运行?

如何配置应用程序以在具有高 DPI 设置(例如 150%)的机器上正确运行?

如何配置应用程序以在具有高 DPI 设置(例如 150%)的机器上正确运行?

png无损格式如何具有不同的质量?

如何在 Windows 上测试不同 DPI/屏幕分辨率的 Qml/Quick UI?