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萬畫素的相機有一千萬畫素,可以採集鏡頭投射到感測器上的影...