WPF單位真的與解析度無關嗎?

2022-02-10 20:50:51 字數 3965 閱讀 1068

wpf從發布之日起,一直將「解析度無關(resolution independence)」作為其亮點,聲稱使用wpf製作的使用者介面在輕巧的ultra-mobile pc的螢幕上和在50英吋的電視機上都能很好地顯示。微軟之所以稱wpf具備「解析度無關」這一特性,主要是因為wpf的座標單位設計成為以1/96英吋為乙個邏輯畫素單位,而不是與裝置相關的畫素單位。

但是微軟本身對wpf「解析度無關」這一特性沒有作更多的具體解釋,導致使用者會產生很多誤解。

改變顯示器的解析度設定,同乙個wpf的使用者介面和繪製的圖形尺寸不會變化。

這個可以用乙個非常簡單的實驗證明該結論是錯誤的。新建乙個wpf應用程式視窗,其中高度為400dius(diu:device independent unit,裝置無關單位),寬度為600dius,讓這個視窗分別在解析度設定為1280 * 1024和800*600的環境下執行,如下圖所示,兩個視窗的尺寸是明顯不一樣的。

圖1左圖為1280 * 1024解析度,右圖為800*600解析度

改變顯示的dpi設定,同乙個wpf的使用者介面和繪製的圖形尺寸不會變化。

顯示的dpi設定,在xp系統下是通過右鍵——屬性——設定選項卡——高階,可以呼叫出來,如下圖所示:

圖 2 顯示屬性dpi設定

這個也可以用同樣的方法進行證明該結論是錯誤的。仍然是高度為400dius[1]

,寬度為600dius的視窗分別執行在96dpi和192dpi兩種設定環境下。從下圖也可以明顯看出視窗的尺寸是不一樣的。

圖3左圖為

96dpi

,右圖為

192dpi

在不同螢幕上,如果dpi設定相同,則同乙個wpf的使用者介面和繪製的圖形尺寸不會變化。

在這個地方有必要對螢幕的dpi設定進行一下解釋說明。dpi設定是指螢幕上每英吋多少個畫素,比如當前設定為96dpi,即螢幕上96個畫素為1英吋。一般的windows xp系統有正常尺寸(96dpi)、大尺寸(120dpi)和自定義尺寸三種選項。既然wpf的座標單位是以1/96英吋為乙個邏輯畫素單位,那麼我們有理由相信,如果兩個顯示器的dpi設定是相同的,那麼同乙個wpf的使用者介面和繪製的圖形尺寸不會變化。很遺憾,這樣的結論依舊是乙個錯誤。

calvinp.schrotenboer

也用乙個實驗證明這是乙個錯誤。實驗環境如

表 1,比如桌面lcd顯示器實際螢幕寬度和高度(畫素單位)為1600 x 1200,這個和普通的解析度設定需要區分,這是顯示裝置的最大解析度或者說是物理解析度,即物理上該顯示器螢幕上是1600 x 1200個像元,英文中又稱這種解析度為「native resolution(原生解析度)」。由於兩個螢幕物理尺寸也不一樣,所以實際的物理dpi可以通過表中的計算公式得到。實際的物理dpi和作業系統的dpi設定是沒有什麼聯絡的。表1

實驗環境

實驗環境

系統一系統二

顯示器型別

桌面lcd顯示器

筆記本lcd顯示器

螢幕寬度和高度

(畫素單位)

1600 x 1200

1400 x 1050

螢幕寬度和高度

(英吋單位)

17.0 x 12.75

12.0 x 9.0

實際的物理dpi

縱向:1600 / 17.0 = 94dpi

橫向:1200 / 12.75 = 94dpi

縱向:1400 / 12 = 117dpi

橫向:1050 / 9 = 117dpi

作業系統的dpi設定

96dpi

96dpi

在兩個不同系統當中執行同乙個wpf應用程式,該程式了繪製了一條長為384dius的直線,換算成英吋即為384/96= 4英吋

。結果在兩個系統當中的實際尺寸如下圖所示:

圖 4 上圖實際尺寸為4.08英吋,下圖實際尺寸為3.28英吋(calvinp.schrotenboer,2006)

其實從表 1當中就能看出一些端倪,原因正是在於實際的物理dpi和作業系統設定的dpi不一致造成的。wpf無法知道當前使用裝置實際的物理dpi為多少,相反通過作業系統的api函式獲得作業系統的dpi值,然後簡單地認為這就是實際的物理dpi值。比如在桌面lcd顯示器上,實際乙個物理像元的尺寸為1/94英吋,由於作業系統設定為96dpi,因此wpf還固執地以為乙個實際的像元為1/96英吋,因此線段長度為1/94 * 384 = 4.08英吋。筆記本顯示器實際乙個物理像元的尺寸為1/117

英吋,因此線段長度為1/117 * 384 = 3.28英吋。這個值和我們測量的結果正好相符。

那麼我們有理由推測,如果將作業系統的dpi設定成實際的物理dpi,則能做到真正的「解析度獨立」,即在兩個不同顯示器上顯示的線段長度都為4英吋,如

圖 5所示:

圖 5左圖為桌面lcd顯示器,將dpi設定成為94,右圖為筆記本顯示器,將dpi設定成為117

wpf的「解析度無關」到現在為止已經是山高月小,水落石出。那麼我們還要接著討論另乙個問題,在顯示器上存在這樣的問題,那麼是否在印表機上也存在這樣的問題呢?仍然可以用乙個實驗證明。同樣繪製乙個4英吋的直線,分別在dpi設定為96dpi和120dpi下進行列印,得到的列印結果尺寸相同。如下圖所示:

圖 6 左圖為系統設定120dpi下列印結果,右圖為系統設定96dpi下列印結果

通過上面幾個實驗分析,我們可以得到如下兩個結論:

(1)wpf在列印得時候可以做到「解析度無關」,即同乙個wpf使用者介面和繪製的圖形尺寸在任何一台印表機上輸出都是一致的;

(2)當顯示器實際象元的物理尺寸和系統設定的dpi保持一致的時候,wpf可以在顯示器上做到「解析度無關」,即同乙個wpf使用者介面和繪製的圖形尺寸在任何一台顯示器(實際象元的物理尺寸和系統設定的dpi保持一致)上輸出都是一致的。反之則無法保證。

「解析度無關」這樣乙個概念,由於微軟本身討論得不多,的確容易造成誤解。最為詳細地討論了wpf當中「解析度無關」的是calvinp.schrotenboer 的一篇博文「is wpf really resolution independent?

」。當然charles peztold也在自己的部落格當中討論過這個問題。另外在微軟的論壇上stephenw,charles peztold等人也就wpf的「解析度無關」和「裝置無關」作了比較深入的討論。

使用者固然可以不理睬這些,但是對於乙個程式設計師來說,尤其是乙個正在做繪圖程式的程式設計師,尤其尤其是乙個還需要列印輸出的繪圖程式設計師,是需要清楚這其中細節的。而且了解細節本身也是一件很愉快的事情。

calvinp.schrotenboer(2006), is wpf really resolution independent?

stephenw, charles peztold,etc(2007), resolution independence?,

WPF 解析度無關性原理

wpf在計算視窗尺寸大小時使用的是系統的dpi設定。wpf視窗以及視窗中所有的元素都是使用裝置無關單位度量。乙個裝置無關單位被定義為1 96英吋。物理單位尺寸 裝置無關單位尺寸 系統dpi 1 96英吋 96dpi 1畫素。當系統預設dpi設定為96dpi時,也就是需要96個畫素填充1英吋的空間,如...

光譜解析度單位 光譜解析度 光譜解析度怎麼計算

光譜解析度指成像的波段範圍,分得愈細,波段愈多,光譜解析度就愈高,現在的技術可以達到5 6nm 奈米 量級,400多個波段。細分光譜可以提高自動區分和識別目.光譜解析度如何選擇 分得愈細,波段愈多,光譜解析度就愈高,現在的技術可以達到5 6nm 奈米 量級,400多個波段。細分光譜可以提高自動區分和...

解析度單位及換算

文章 對於測試數字成像裝置非常重要的引數是解析度。但有不同的方式來表達數位相機的解析度,有時令人困惑。下面介紹的是是最常見的單位。百萬畫素 這台相機有1000萬畫素的解析度 是我們經常在廣告上看到的資料,但是從技術上看,這是錯誤的。乙個1000萬畫素的相機有一千萬畫素,可以採集鏡頭投射到感測器上的影...