簡體   English   中英

在C#中將像素轉換為英寸,反之亦然

[英]Convert Pixels to Inches and vice versa in C#

我希望將像素轉換為英寸,反之亦然。 我知道我需要DPI,但我不知道如何獲取這些信息(例如我沒有Graphics對象,所以這不是一個選項)。

有辦法嗎?

在視頻設備上,對此問題的任何回答通常都不是很准確。 用於了解原因的最簡單示例是投影儀。 例如,輸出分辨率為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);

在沒有了解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屬性。 只需記住在創建圖形對象后處理它(理想情況下使用Using語句)。

如果您沒有使用WinForms,請告訴我們它是什么類型的應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM