1. 程式人生 > >Android開發之顯示篇(弄懂ppi、dpi、pt、px、dp、dip、sp之間的關係看這一篇就夠了)

Android開發之顯示篇(弄懂ppi、dpi、pt、px、dp、dip、sp之間的關係看這一篇就夠了)

版權申明】非商業目的註明出處可自由轉載
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/85165773
出自:shusheng007

文章目錄

概述

前段時間看了小米8的釋出會,其中螢幕引數是如下介紹的:

小米8採用6.21英寸的三星AMOLED螢幕,解析度為2248x1080,402 PPI ,縱橫比是18.7:9,屏佔比為86.68%,最高亮度600nit。

當時我就在想這都是怎麼算出來的,雖然我知道PPI是指螢幕每一英寸上包含的畫素點,但是稍微往深一想我發現我對這些引數真的很迷茫,好奇心驅使我做了些調查。

要解決的疑問

  1. 螢幕的畫素與圖片的畫素是一回事嗎?
  2. 螢幕的解析度和圖片的解析度是同一回事嗎,分別代表什麼,二者什麼關係?
  3. PPIDPI 是一回事嗎,什麼關係?
  4. ptpx什麼關係?
  5. Android中的dppx什麼關係?
  6. Android中的dpsp什麼關係?
  7. Android中dip是什麼,與px什麼關係?

概念篇

畫素

畫素,英文為Pixel,是我們日常最熟悉不過的了,但是深入進去會發現其蘊含的知識量是巨大的,此篇對於畫素話題也只是淺嘗輒止,拋磚引玉。

討論畫素需要分不同的場景:

  1. 數字影象
    我們程式設計師日常工作中接觸並討論的畫素大多是指這個範疇。

    畫素是組成光柵圖片(Raster graphics)的最小單位。

    光柵圖片(Bitmap)是我們日常接觸最多的,例如 jpg,jpeg,png,gif,bmp等等,另一種比較常見的就是向量圖了。 光柵圖片是由一個一個畫素組成的,那麼畫素包含哪些資訊?有物理尺寸嗎?

    每個畫素由顏色資訊組成,有的還包含一個透明度資訊。因為可以通過三原色Red,Blue,Green來混合出很多種顏色,所以一個畫素就可以使用儲存這三種顏色的一個數據結構表示。一個畫素佔用記憶體的大小,與其使用多少位來表示這些顏色有關,例如最簡單的畫素只有一個bit,那麼它只能表示兩個狀態,0或者1,對應到影象上也就是黑白。當一個畫素達到24bit的時候,RGB每個通道佔8位,可以組合出來的顏色已經有1677萬色(256256256=16,777,216)種了,而人類眼睛可以分辨的顏色也只有大概1000多萬種,此時就是真彩色了。當然還有32位真彩色,感興趣的可以去研究。
    在這裡插入圖片描述
    圖片來自維基百科

    那麼通過以上的介紹,我們可以得出結論,此處的畫素沒有物理尺寸,僅僅是一些資料,只有將其顯示在物理裝置上才會存在物理尺寸。

  2. 硬體顯示裝置
    對於硬體顯示裝置,我們這邊特指手機螢幕和顯示器吧,畫素是其顯示的基本單位。顯示屏目前廣泛採用點陣顯示,將任何的顯示裝置放大一定程度,可以看到基本都是由RGB三個小燈管組成一個畫素(這個我沒有辦法去驗證,但是以前玩google 那個紙板VR眼鏡,近距離放大看手機螢幕時,可以看到螢幕上的小網,每個小網格就是一個螢幕的畫素)。

    可以通過下圖感受一下
    在這裡插入圖片描述
    圖片來源

解析度

討論解析度仍然需要分討論場景

  1. 數字影象
    此時解析度是用來描述圖片的畫素資訊的,比如我們說一張圖片的解析度是1280*720,那麼僅僅是說明這張圖片是由1280個畫素* 720個畫素組成的。如下圖所示,至於這張圖片的尺寸有多大,清晰還是模糊,這取決於它自身的儲存格式以及用來顯示它的裝置。

    在這裡插入圖片描述

  2. 硬體顯示裝置
    是指這塊螢幕所包含的畫素(這個畫素是物理上的,前面我們已經討論過了)。例如小米8的螢幕解析度為2248x1080,說明這塊螢幕包含了這麼多物理畫素。

那麼圖片的解析度與螢幕的分別率是什麼關係呢?這需要清楚了PPI後才可以回答這個問題。

PPI與DPI

DPI是印刷業使用的單位,其表示的是列印紙上每一英寸包含的墨點數量,而PPI是電子螢幕上每一英寸上包含的可定址物理物理顯示單元。其中英寸是西方慣用長度單位,等於2.54釐米。這兩個概念之所以如此容易混淆,就是因為一些軟體提供商做的孽,例如Microsoft,Adobe,Apple 等等,他們經常將這兩個概念互換使用。

PPI

PPI: Pixels Per Inch, 每一英寸上包含的畫素個數。
這個值越高,螢幕的顯示能力越強,例如小米8 PPI的計算方式如下圖所示
在這裡插入圖片描述

108 0 2 + 224 8 2 6.21 = 401.6 \frac{\sqrt{1080^2+2248^2}}{6.21}=401.6
可見小米8的PPI是401.6,而其官方宣稱為402,估計是四捨五入了,不過不知道半個畫素怎麼處理,知道的可以告訴我一下。

DPI

DPI: Dots Per Inch, 每一英寸上包含的點個數。
與PPI計算方式一樣,只是應用的領域不同,這個用在印刷業的。

至此我們可以回答圖片的解析度與螢幕的解析度的關係了,以小米8為例,按照圖片比例全屏顯示某一張圖片:
第一:當將一張1080*2248畫素的圖片顯示在Mi8上時,螢幕上的每一個物理畫素對應一個圖片畫素,可以完美顯示。
第二:當將一張2000*2248畫素的圖片顯示在Mi8上時,Mi8的螢幕在寬度上是無法顯示的,所以顯示卡會將圖片光柵化,通過一定的演算法將2000個畫素減少到1080個畫素,由於是從多到少的處理,所以圖片是清晰的。
第三:當將一張720*1280畫素的圖片顯示在Mi8上時,顯示卡會將圖片光柵化,將圖片以其中一邊為標準拉伸,圖片會變模糊。

Pt vs Px

Pt :漢語翻譯為,是一個物理尺寸,長度為1/72 英寸,在概念上Pt與Px毛關係也沒有,但是在photoshop中就有關係了。photoshop 中的pt卻是一個相對單位(這幫二貨各種混用)

換算公式:1pt= (DPI / 72) px

Android中的dp與px關係

dp: Density-independent Pixels, 這個是Android基於物理裝置的ppi抽象出來的一個單位。它是以160dpi的螢幕為基準定義的,在160dpi的螢幕的螢幕上1dp=1px,那麼我們就可以得出其

換算公式: 1dp=(螢幕ppi/ 160)px

目前Android系統的螢幕分類如下表

密度分類 螢幕密度
ldpi 120dpi
mdpi 160dpi
hdpi 240dpi
xhdpi 320dpi
xxhdpi 480dpi
xxxhdpi 640dpi

Android中的dp與sp關係

sp: Scale-independent Pixels,其與dp基本一樣,也是畫素無關的,但是是用在描述字型的大小上。其尺寸會同時相應螢幕密度以及使用者對字型的偏好設定。
例如:在手機的字型設定為預設大小時,使用dpsp描述字型的大小是一樣的,如下圖

在這裡插入圖片描述
但是當我們改變了手機的字型預設設定的字號後,dp描述的字型大小沒有變化,但是sp描述的字型大小卻相應的發生了變化,如下圖。
在這裡插入圖片描述

除此之外dpsp再無差異,一般建議字型使用sp作為單位。

Android中dip是什麼,與px的關係

dip 就是dp互為別名,沒有任何區別,其與px關係見上文。

總結

以上就是關於顯示接觸GUI開發的程式設計師應該瞭解的,本來以為很簡單,但是調查後發現再往深研究我將會陷入泥潭無法自拔。同時我也感受到,人類社會發展到目前的水平,任何一個門類的知識都足以讓一個人投入終身的時間去研究,那我們程式設計師除了賺錢養家是不是應該找個自己感興趣方向忠貞不渝的投入一生業餘精力去嘗試研究一番呢?在此我覺得我很挫敗,突然發現自己這麼大年紀了竟然沒有愛好,如果愛好美女這個不算的話。。。!