GDI+同机不同进程下的字体大小差异

GDI+ font size difference under different processes on same machine

改写问题:

当我从 Visual Studio 中的单元测试中绘制位图时,我在桌面上的缩放系数会被考虑在内,但当我从控制台 运行 时,它不会。

如何使使用 Graphics.DrawString 渲染的文本无论我的桌面设置如何都表现一致?


我有一些使用 GDI+ 创建位图的 NUnit 测试,并将它们与预先保存的图像进行比较,以确保生成正确的图像。

我的问题是,当我 运行 在 Visual Studio 中进行测试时,文本(使用 Graphics.DrawString 呈现)与我 运行 时生成的文本不同然后在我的命令行构建脚本中进行测试(使用 NUnit 3.2 测试 运行ner)。

注意:这不是一些小的像素偏移或文字换行问题。 运行从控制台呈现的文本字体大小更小。

有谁知道为什么同一台机器上的字体大小会因执行环境不同而不同?同样重要的是:我能做些什么?

控制台模式应用程序几乎从未被声明过 dpiAware。这在您创建位图时很重要,它们的默认 Horizontal/VerticalResolution 属性 将是每英寸 96 像素,而不管视频适配器 运行 是什么。 DPI 虚拟化功能可以解决这个问题。这反过来会影响用于字体的像素数,因为默认情况下它们的大小以点为单位指定。 1 磅是 1/72 英寸,您需要绘制多少像素,例如 9 磅字体取决于每英寸像素比率。它将是 9 / 72 * 96 = 12 像素。

在运行于 144 dpi 视频适配器上的 dpiAware 程序中,相同的文本将是 9 / 72 * 144 = 18 像素高。引导您得出控制台模式应用程序使文本太小的结论。或者 dpiAware 应用程序使它们太大,具体取决于您的观点。

DPI 感知或虚拟化通常很重要,它可以防止程序在高分辨率显示器上创建不可读的文本。在 4K 显示器上,12 像素高的文本看起来就像一粒灰尘。这并不完全适用于创建位图的控制台模式应用程序。尽管您可能会考虑创建更大的位图并因此也使用更大的文本。因为如果你不这样做,那么当它们必须重新缩放以匹配 4K 显示器时,它们看起来不会很好。对于文本尤其明显,抗锯齿像素变成不再抗锯齿的巨石。

如果不是,并且您只关心以像素为单位的大小,您应该考虑通过使用采用 GraphicsUnit 的字体构造函数之一来避免此问题。您会喜欢 GraphicsUnit.Pixel 而不是默认值。无论视频适配器设置如何,您都将获得一个可预测的文本高度 (以像素为单位),这是整个位图高度的固定比例。