2009-01-23 64 views
7

我期待將像素轉換爲英寸,反之亦然。我知道我需要DPI,但我不知道如何獲取此信息(例如,我沒有Graphics對象,所以這不是一個選項)。在C#中將像素轉換爲英寸,反之亦然#

有沒有辦法?

+0

DPI是什麼?屏幕?打印機? ...? – 2009-01-23 22:12:08

回答

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); 
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(或者更準確地說,是當前的打印機設置)。

+0

因此,鑑於我無法訪問Graphics對象,我該如何計算DPI? – AngryHacker 2009-01-23 22:43:36

+0

解決DPI的方程,假設其餘的已知。 – falstro 2009-01-23 22:52:03

+0

我如何知道顯示器的對角線長度?我的應用程序將在我無法控制的計算機上運行。 – AngryHacker 2009-01-23 23:00:43

1

您可以創建Graphics對象只需調用this.CreateGraphics()(或更一般Control.CreateGraphics()),然後你似乎知道使用DPIX和DpiY性能。請記住在創建它之後處理圖形對象(理想情況下使用Using語句)。

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

相關問題