8

我希望将像素转换为英寸,反之亦然。我知道我需要 DPI,但我不确定如何获取此信息(例如,我没有Graphics对象,所以这不是一个选项)。

有办法吗?

4

3 回答 3

7

在视频设备上,这个问题的任何答案通常都不是很准确。用于了解为什么会这样的最简单示例是投影仪。例如,输出分辨率为 1024x768,但 DPI 会因屏幕与投影仪孔径的距离而异。例如,WPF 始终假定视频设备上的 DPI 为 96。

Presuming you still need an answer, regardless of the accuracy, and you don't have a Graphics object, you can create one from the screen with some P/Invoke and get the answer from it.

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);
于 2009-01-23T23:38:07.787 回答
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(或者更准确地说,是当前的打印机设置)。

于 2009-01-23T22:14:39.500 回答
1

您可以通过调用this.CreateGraphics()(或更一般地Control.CreateGraphics())简单地创建 Graphics 对象,然后使用您似乎知道的 DpiX 和 DpiY 属性。只需记住在创建图形对象后处理它(最好使用 Using 语句)。

如果您不使用 WinForms,请告诉我们它是什么类型的应用程序。

于 2009-01-23T22:26:01.710 回答