改述问题:
当我从Visual Studio中的单元测试中绘制位图时,会考虑我桌面上的缩放系数,但是当我从控制台运行时它不是。
无论桌面设置如何,使用Graphics.DrawString渲染文本的行为都能保持一致吗?
我有一些使用GDI +创建位图的NUnit测试,并将它们与预先保存的图像进行比较,以确保生成正确的图像。
我的问题是,当我在Visual Studio中运行测试时,文本(使用Graphics.DrawString呈现)与我在命令行构建脚本中运行测试时生成的内容相比(使用NUnit 3.2测试运行器) )。
注意:这不是一些小的单像素关闭或文本换行问题。从控制台运行时呈现的文本的字体大小更小。
根据执行环境,有人知道为什么字体大小会因同一台机器而异吗?同样重要的是:我能做些什么呢?
答案 0 :(得分:1)
控制台模式应用程序几乎从未声明为dpiAware。在创建位图时,无论视频适配器运行的是什么,它们的默认水平/垂直分辨率属性都是每英寸96像素。 DPI虚拟化功能可以解决这个问题。这又会影响用于字体的像素数,因为默认情况下它们的大小以磅为单位指定。一点是1/72英寸,你需要绘制多少像素,比如9点字体取决于每英寸像素的比例。它将是9/72 * 96 = 12像素。
在一个运行在144 dpi视频适配器上的dpiAware程序中,相同的文本将是9/72 * 144 = 18像素高。引导您得出结论,控制台模式应用程序使文本太小。或者dpiAware应用程序使它们太大,这取决于您的观点。
DPI感知或虚拟化通常很重要,它可以防止程序在高分辨率显示器上创建不可读的文本。在4K显示器上,12像素高的文字看起来像一片灰尘。这并不完全适用于创建位图的控制台模式应用程序。虽然您可能会考虑创建更大的位图,因此也使用更大的文本。因为如果你不这些小位图,当它们必须重新调整以匹配4K监视器时看起来不是很好。对于文本尤其明显,抗锯齿像素变成不再消除锯齿的巨石。
如果没有,并且你只关心像素的大小,你应该考虑通过使用一个带有 GraphicsUnit 的Font构造函数来避免这个问题。你会喜欢GraphicsUnit.Pixel而不是默认值。无论视频适配器设置如何,您都将获得可预测的文本高度(以像素为单位),这是整个位图高度的固定比例。