我想要将像素转换成英寸,反之亦然。我知道需要DPI值,但是我不确定如何获取这个信息(例如,我没有Graphics
对象,所以这不是一个选项)。
有什么方法吗?
我想要将像素转换成英寸,反之亦然。我知道需要DPI值,但是我不确定如何获取这个信息(例如,我没有Graphics
对象,所以这不是一个选项)。
有什么方法吗?
在视频设备上,对于这个问题的任何答案通常都不是非常准确的。最容易用来解释这种情况的例子是投影仪。输出分辨率为1024x768,但DPI根据屏幕距离投影仪光圈的远近而变化。例如,WPF始终假设视频设备的DPI为96。
假设您仍然需要一个答案,无论其准确性如何,并且没有Graphics对象,您可以使用一些P/Invoke从屏幕创建一个并从中获取答案。
Single xDpi, yDpi;
IntPtr dc = GetDC(IntPtr.Zero);
using(Graphics g = Graphics.FromHdc(dc))
{
xDpi = g.DpiX;
yDpi = g.DpiY;
}
if (ReleaseDC(IntPtr.Zero) != 0)
{
// GetLastError and handle...
}
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
private static extern Int32 ReleaseDC(IntPtr hwnd);
如果不知道DPI,实际上就没有真正的方法。像素是离散的,而英寸并不是。如果你在谈论显示器上的英寸,你需要知道(至少)分辨率(和像素宽高比)以及可见监视器区域的大小才能计算出DPI。通常可以在某个地方获取分辨率(我不是C#或.NET程序员,所以无法帮助您),但通常无法获取监视器的大小。如果估计值足够好,那么请用户输入监视器的大小(例如21英寸),然后解决DPI:
(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2
假设您已知对角线和分辨率,这是给出的。
DPI = sqrt(resX^2+resY^2)/screenDiagonal
这只是一个估计值,因为显示器通常不会完全是21英寸(或其他尺寸),像素宽高比也很少恰好是1:1。
如果你在谈论纸上的英寸,则自然需要知道打印机的DPI(或更准确地说,当前的打印机设置)。
this.CreateGraphics()
(或更一般的Control.CreateGraphics()
)来创建 Graphics 对象,然后使用 DpiX 和 DpiY 属性,就像您所了解的那样。请记住,在创建完 Graphics 对象后要进行清除(最好使用 Using 语句)。