【问题标题】:GDI+ font size difference under different processes on same machine同一台机器不同进程下的GDI+字体大小差异
【发布时间】:2023-03-29 11:58:01
【问题描述】:

改写的问题:

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

无论我的桌面设置如何,如何使使用 Graphics.DrawString 呈现的文本行为一致?


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

我的问题是,当我在 Visual Studio 中运行测试时,文本(使用 Graphics.DrawString 渲染)与我在命令行构建脚本中运行 then 测试时生成的文本(使用 NUnit 3.2 测试运行器)不同)。

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

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

【问题讨论】:

  • 能否展示相关部分(Graphics在哪里获得,DrawString如何使用等)?

标签: c# .net unit-testing fonts gdi+


【解决方案1】:

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

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

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

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

【讨论】:

  • 我在发布我的问题后告诉了我的同事; Hans Passant 将在几分钟内向我们解释这一点 - 你做到了! :-) #英雄
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 2013-08-27
  • 2014-01-29
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
相关资源
最近更新 更多