winforms 在C#中将像素转换为英寸,反之亦然

izkcnapc  于 2022-11-17  发布在  C#
关注(0)|答案(3)|浏览(215)

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

bweufnob

bweufnob1#

在视频设备上,对这个问题的任何回答通常都不是很准确。要了解为什么会出现这种情况,最简单的例子就是投影仪。输出分辨率是,比如说,1024 x768,但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);
gg58donl

gg58donl2#

实际上,不知道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(或者,更准确地说,当前的打印机设置)。

oknwwptz

oknwwptz3#

您可以通过调用this.CreateGraphics()(或者更一般地说Control.CreateGraphics())来创建Graphics对象,然后使用您似乎知道的DpiX和DpiY属性。只需记住在创建图形对象后对其进行处理(最好使用Using语句)。
如果您没有使用WinForms,请告诉我们它是哪种应用程序。

相关问题