我希望将像素转换为英寸,反之亦然。我知道我需要DPI,但我不知道如何获取这些信息(例如我没有Graphics
对象,所以这不是一个选项。
有办法吗?
答案 0 :(得分:7)
在视频设备上,此问题的任何答案通常都不是很准确。用于了解原因的最简单示例是投影仪。例如,输出分辨率为1024x768,但DPI会因屏幕与投影机的距离而有所不同。例如,WPF在视频设备上始终采用96 DPI。
假设您仍然需要答案,无论准确性如何,并且您没有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);
答案 1 :(得分:6)
在没有了解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(或者更准确地说,当前的打印机设置)。
答案 2 :(得分:1)
您可以通过调用this.CreateGraphics()
(或更一般地Control.CreateGraphics()
)来创建Graphics对象,然后使用您似乎知道的DpiX和DpiY属性。只需记住在创建图形对象后处理它(理想情况下使用Using语句)。
如果您没有使用WinForms,请告诉我们它是什么类型的应用程序。