2009-01-07 20 views
7

我想在我的應用程序中以'真實大小'顯示圖像。爲此,我需要知道顯示器的像素大小。如何在.NET中確定我的Monitor的真實像素大小?

我知道windows顯示分辨率名義上是96dpi,但爲了我的目的,我想要更好的猜測。我知道這些信息可能並不總是可用或準確的(例如較舊的CRT顯示器),但我想像着LCD顯示器的前景,這應該是可能的!

有沒有辦法讓我的顯示器像素大小?

有沒有辦法確定像素大小是否準確?

.NET API的首選(我找不到它們),但Win32也可以,我很樂意P/Invoke。

回答

24

對於顯示器尺寸,您需要Screen.PrimaryScreen.Bounds.Size(或Screen.GetBounds(myform))。

如果你想DPI,使用GraphicsDpiXDpiY屬性:

PointF dpi = PointF.Empty; 
using(Graphics g = this.CreateGraphics()){ 
    dpi.X = g.DpiX; 
    dpi.Y = g.DpiY; 
} 

哦,等等!你想要真正的,拿着一把尺子到顯示器並測量,尺寸?!不可以。使用任何 OS服務都不可能。操作系統不知道顯示器的實際尺寸,或者用戶如何校準。這些信息中的一部分在理論上是可檢測的,但它不足以確保操作系統能夠可靠地使用它,所以它不會。

作爲解決辦法,您可以嘗試幾件事情。

  • 你可以嘗試查詢已安裝的監視器設備的顯示字符串(我不知道該怎麼做),看看你是否可以解析出一個合理的大小。例如,顯示器可能是一個「ValueBin E17p」,你可能會推測它是一個17英寸的顯示器,當然,這個顯示字符串可能是「即插即用顯示器」。在最好的。
  • 你可以用戶他們有什麼尺寸的顯示器。也許他們會知道。

一旦你知道(或認爲你知道)顯示器的對角線尺寸,你需要找到它的物理長寬比。再次,有幾件事:

  • 假設當前像素縱橫比與顯示器的物理縱橫比相匹配。這假定(A)用戶選擇了對於他們的顯示器是理想的分辨率,並且(B)顯示器具有正方形像素。我不知道目前面向消費者的電腦顯示器沒有方形像素,但是老式的顯示器和新的顯示器都可能。
  • 詢問用戶。 也許他們會知道的。

一旦你知道(或認爲你知道)什麼顯示器的對角線尺寸和物理方面的比例是,那麼你就可以計算出它的物理寬度和高度。一個 + B = C ,使一些計算將提供給你的好:

如果你發現這是一個17" 顯示器,其當前的分辨率是1280 * 1024:
+ 1024 = 2686976
SQRT(2686976)= 1639.1998047828092637409837247032
17" * 1280/1639.2 = 13.274768179599804782820888238165"
17" * 10 24/1639.2 = 10.619814543679843826256710590532「

這使物理寬度爲13.27」,物理高度爲10.62「。這使得像素爲13.27「/1280=10.62」/ 1024 = 0.01037「或大約0.263mm。

當然,如果用戶沒有合適的分辨率,所有這些都是無效的,正方形像素,或者它是一個較老的模擬監視器,並且控件沒有適當地調整以適應顯示器以填充整個物理屏幕,或者更糟糕的是,它可能是投影儀。一個校準步驟,您可以讓用戶實際上擁有一個直尺至屏幕的尺子,並且可以爲您測量某種尺寸。您可以:

  • 讓用戶單擊一個英寸(或釐米)的任意兩個點上的鼠標。
  • 在屏幕上畫一個盒子,讓用戶按下上下箭頭來調整它的高度,然後用左右箭頭來調整它的寬度,直到盒子正好按照它們的一英寸(或釐米)統治者。
  • 在屏幕上繪製一個框,讓用戶告訴你每個維度有多少英寸/釐米。

無論你做什麼,不要指望你的結果是100%準確。每次都有太多因素可以讓你(或者用戶)明白這一點。

請注意,96 dpi通常是挨近要準確。非投影屏幕上的現代像素傾向於大約爲0.25毫米,因此如果將顯示器設置爲其原始分辨率,則通常以每英寸100個物理像素爲單位給出或取出100個物理像素。(當然,這是一個巨大的概括,並且不是適用於所有顯示器。例如,如果我記得規格正確,Eee PC的像素大小約爲0.19 mm。)

1

對不起,您必須對此信息進行P/Invoke。

下面是我前一陣子用於它的鏈接: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

+1

這看起來只是得到任何窗口有DPI設置,這一般會96DPI無論屏幕大小和分辨率。 – 2009-01-07 22:08:22

+2

這是圖形將返回的實例(請參閱P爸爸的答案)。無需P/Invoke。 – 2009-01-12 20:49:07

1

你可以只是從你的屏幕尺寸手工計算檢查

cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2) 

這將使你英寸

像素寬度
+0

我認爲問題是如何以編程方式獲取LCD_SCREEN_DIAGONAL_IN_INCHES – 2009-01-07 22:07:50

1

GetDeviceCaps可以P/Invoke'd得到一些數字,但我從來不知道這些數字是值得信賴的...

相關問題