我想在我的应用程序中以“真实大小”显示图像。 为此,我需要知道显示器的像素大小。
我知道窗口显示分辨率名义上是96dpi,但为了我的目的,我想要一个更好的猜测。 我知道这些信息可能并不总是可用或准确的(例如较旧的CRT显示器),但是我想用液晶显示器的前景来想象这应该是可能的!
有没有办法获得我的显示器的像素大小?
有没有办法确定像素大小是否准确?
.NET API的首选(我找不到它们),但Win32也可以,我很乐意P / Invoke。
对于显示大小,您需要Screen
Screen.GetBounds(myform)
或Screen.GetBounds(myform)
)。
如果您需要DPI,请使用Graphics的DpiX和DpiY属性:
PointF dpi = PointF.Empty; using(Graphics g = this.CreateGraphics()){ dpi.X = g.DpiX; dpi.Y = g.DpiY; }
等一下! 你想要实际的,拿着一个统治者的显示器和措施,大小?! 不可以。使用任何 OS服务都不可能。 操作系统不知道显示器的实际尺寸,或者用户如何校准。 这些信息中的一部分在理论上是可以检测到的,但是对于操作系统来说它是不可靠的,所以不能。
作为一个解决办法,你可以尝试一些事情。
一旦你知道(或者认为你知道)显示器的对角线尺寸,你需要找到它的物理纵横比。 再次,几件事情:
一旦你知道(或者认为你知道)显示器的对角线尺寸和物理宽高比,那么你可以计算出它的物理宽度和高度。 A 2 + B 2 = C 2 ,所以一些计算会给你带来好处:
如果你发现它是一个17“的显示器,它的当前分辨率是1280×1024:
1280 2 + 1024 2 = 2686976
Sqrt(2686976)= 1639.1998047828092637409837247032
17“* 1280 / 1639.2 = 13.274768179599804782820888238165”
17“* 1024 / 1639.2 = 10.619814543679843826256710590532”
这使得物理宽度为13.27“,物理高度为10.62”。 这使像素13.27“/ 1280 = 10.62”/ 1024 = 0.01037“或约0.263毫米。
当然,如果用户没有合适的分辨率,监视器具有古怪的非方形像素,或者它是一个较老的模拟监视器,并且控制器没有适当地调整以充满整个物理显示器屏幕。 或者更糟的是,它可能是一台投影仪。
最后,您可能最好执行一个校准步骤,在这个步骤中,用户需要在屏幕上放置一个尺子 ,然后测量一些东西的尺寸。 你可以:
不管你做什么 ,不要期望你的结果是100%准确的。 每次都有太多因素可以让你(或者用户)得到完全正确的结果。
请注意,96 dpi通常非常接近准确。 非投影屏幕上的现代像素通常约为0.25毫米,因此,如果显示器设置为原始分辨率,则通常每英寸约有 100个物理像素。 (当然,这是一个巨大的泛化,并不适用于所有的显示器,例如,如果我记得规格正确,Eee PC的像素大小约为0.19毫米。)
对不起,您必须对此信息进行P / Invoke。
以下是我刚才使用的链接: http : //www.davidthielen.info/programming/2007/05/get_screen_dpi_.html
您可以通过手动计算您的屏幕大小进行检查
cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2)
这会给你的像素宽度英寸
GetDeviceCaps
可以P / Invoke'd获得一些数字,但我从来不知道这些数字是值得信赖的…
您可以使用存储在注册表中的EDID信息获取显示器的物理尺寸。 您可以使用EnumDisplayDevices窗口API调用获取适当的监视器的注册表项。
物理尺寸到屏幕对象 :