解析度與DPI組合

2022-02-09 21:19:08 字數 1832 閱讀 8653

昨天看到園子裡的一篇關於dpi的部落格,我沒看太懂。相信有很多人對解析度和dpi不是很清楚。網上也沒有好的解釋。我補個漏。

假設有這麼回事:諾基亞和微軟合作以後,出了一款搭載windows 7的平板電腦: npad,螢幕大小10英吋×8英吋,物理解析度是960×768.也就是說每英吋有96個物理畫素點(顯像點)。

你為npad編寫了乙個windows版本的《憤怒的小鳥》,小鳥寬度為螢幕1/10(也就是1英吋)時最合適。在windows中螢幕解析度有兩種960×768,480×354,為了充分利用螢幕的物理特性,也為了討論簡單,在windows中設定為960×768,這樣乙個物理畫素就等於乙個物理畫素點(顯像點)。windows的dpi預設設定成96

假設wpf的單位是物理畫素,那麼你在程式裡寫下:bird.width = 96,這時寬度正好是螢幕的1/10,也就是1英吋。注意此時和dpi的設定沒有關係,因為使用的是物理畫素。到現在為止一切都很好。

過了一段時間諾基亞推出了npad2,螢幕當然還是10英吋×8英吋,但是物理解析度是1920×1536,也就是每英吋有192個物理畫素點(顯像點)。解析度提公升了,顯示更細膩更逼真了。而你把windows解析度設定成了1920×1536(再一次:為了充分利用硬體,也為了簡單:乙個物理畫素就等於乙個物理畫素點)windows的dpi依然預設設定成96。

此時問題出現了,你的程式是bird.width=96,是以物理畫素為單位的。那麼96個物理畫素變成了螢幕的1/20,也就是0.5英吋的,你的小鳥變小了,看著費勁了!那怎麼辦?應該把小鳥的寬度設定成192個畫素,程式改為:bird.width=192,此時又成了1英吋了。這等於我們要根據不同的螢幕,寫不同的程式。還有一種方法我們不討論了,就是把windows解析度設定成960×768(注意:此時1個物理畫素就等於4個物理畫素了),這樣一來硬體白公升級了。

問題出在**呢?是因為螢幕的物理解析度是變化的,我們的wpf程式不應該以物理畫素為單位,而應該用邏輯畫素為單位,這個邏輯畫素是多大呢?wpf規定為dpi/96。這樣一來,我們的程式就不用改了,只要我們告訴windows,dpi是多少就行了,ok,我們在windows中設定了dpi為192(npad2的螢幕確實1英吋有192個物理畫素點,這是符合事實的).此時小鳥又是1英吋寬了。

也就是讓windows知道這個裝置的每英吋有多少個物理畫素點。這樣windows就會把bird.width = 96 語句換算成真正的192個畫素(96*(192/96),這裡的192就是dpi的值)。問題得到了圓滿解決。

簡單地說,就是螢幕物理解析度提公升了(不是解析度增大,如果乙個20英吋寬的螢幕,物理解析度為1920×1536,這塊螢幕精確程度,細膩程度和npad沒有區別),dpi也隨之變化,以抵消螢幕解析度變化對程式產生的影響,這裡的物理解析度可以叫做「裝置真實dpi」

wpf程式中設定了小鳥寬度為96,並不是說這個小鳥就是1英吋,需要把顯示器的解析度和dpi都設定匹配了才是1英吋。

在wpf中1個邏輯畫素,當dpi是96時,等於1個物理畫素。當dpi是192時,等於2個物理畫素......再也不硬性制定長度單位是1個物理畫素了。

關於畫素,解析度,DPI

1 什麼是畫素?簡單的說,我們通常所說的畫素,就是ccd cmos上光電感應元件的數量,乙個感光元件經過感光,光電訊號轉換,a d轉換等步驟以後,在輸出的 上就形成乙個點,們如果把影像放大數倍,會發現這些連續色調其實是由許多色彩相近的小方點所組成這些小方點就是構成影像的最小單位 畫素 pixel 畫...

解析度 Dpi 的關係

概念 解析度,指的是影象或者顯示屏在長和寬上各擁有的畫素個數。比如一張 解析度為1920x1080,意思是這張 是由橫向1920個畫素點和縱向1080個畫素點構成,一共包含了1920x1080個畫素點。dpi是解析度的表示單位之一。它是英文dot per inch的縮寫,意思是 每英吋的點數 上面我...

MFC獲取螢幕尺寸 解析度 DPI

1.獲取螢幕解析度 int iwidth getsystemmetrics sm cxscreen 獲取螢幕水平解析度 int iheight getsystemmetrics sm cyscreen 獲取螢幕垂直解析度 或者 hdc hdc getdc null int iscrwidth get...