当前位置:  开发笔记 > 编程语言 > 正文

如何确定.NET中Monitor的真实像素大小?

如何解决《如何确定.NET中Monitor的真实像素大小?》经验,为你挑选了1个好方法。

我想在我的应用程序中以"真实大小"显示图像.为此,我需要知道显示器的像素大小.

我知道Windows显示分辨率名义上是96dpi,但出于我的目的,我想要更好的猜测.我知道这些信息可能并不总是可用或准确的(例如较旧的CRT显示器),但我认为LCD显示器的前提是这应该是可能的!

有没有办法获得显示器的像素大小?

有没有办法确定像素大小是否准确?

.NET API是首选(我找不到它们),但Win32也行,我很高兴P/Invoke.



1> P Daddy..:

对于您想要的显示尺寸(或).Screen.PrimaryScreen.Bounds.SizeScreen.GetBounds(myform)

如果需要DPI,请使用Graphics的DpiX和DpiY属性:

PointF dpi = PointF.Empty;
using(Graphics g = this.CreateGraphics()){
    dpi.X = g.DpiX;
    dpi.Y = g.DpiY;
}

等一下!你想要实际的,拿一把尺子直到显示器并测量尺寸?!不可以使用任何 OS服务.操作系统不知道显示器的实际尺寸,或用户如何校准显示器.其中一些信息在理论上是可检测的,但对于操作系统来说,它不能确定性地可靠地使用它,所以它没有.

作为一种解决方法,你可以尝试一些事情.

您可以尝试查询已安装的监视器设备的显示字符串(我不知道该怎么做)并查看是否可以解析出合理的大小.例如,显示器可能是"ValueBin E17p",您可能会推断出它是一个17英寸的监视器.当然,这个显示字符串很可能是"即插即用监视器".这个方案最好是粗略的.

您可以询问用户他们有什么尺寸的显示器. 也许他们会知道的.

一旦您知道(或认为您知道)显示器的对角线尺寸,您需要找到它的物理纵横比.同样,有几件事:

假设当前像素长宽比与显示器的物理宽高比相匹配.这假定(A)用户选择了适合其监视器的分辨率,并且(B)监视器具有方形像素.我不知道当前面向消费者的计算机显示器没有方形像素,但是较旧的计算机显示器和新的像素可能.

询问用户. 也许他们会知道的.

一旦你知道(或认为你知道)什么显示器的对角线尺寸和物理方面的比例是,那么你就可以计算出它的物理宽度和高度.A 2 + B 2 = C 2,所以一些计算会给你带来好处:

如果您发现它是17"显示器,其当前分辨率为1280 x 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.263mm.

当然,如果用户没有合适的分辨率,显示器具有古怪的非方形像素,或者它是较旧的模拟监视器,并且控制器未正确调整以使显示器填满整个物理,则所有这些都无效屏幕.或者更糟糕的是,它可能是一台投影机.

最后,您可能最好执行校准步骤,让用户实际将标尺固定在屏幕上,并为您测量某些尺寸.你可以:

让用户在相隔两英寸(或厘米)的任意两点上单击鼠标.

在屏幕上画一个框,让用户按向上和向下箭头调整其高度,用左右箭头调整其宽度,直到盒子根据他们的标尺正好是一英寸(或厘米)的正方形.

在屏幕上画一个框,让用户告诉你每个维度的英寸/厘米数.

无论你做什么,都不要指望你的结果是100%准确的.每次都有很多因素可以帮助您(或用户)完全正确.

请注意,96 dpi通常非常接近准确.非投影屏幕上的现代像素都倾向于大约0.25毫米,给定或拍摄,因此如果将显示器设置为其原始分辨率,通常最终每英寸 100个物理像素,给予或接受.(当然,这是一个巨大的概括,并不能适用于所有的显示器.的Eee PC机,例如,具有像素约0.19毫米大小,如果我没有记错的规格.)

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有