今天学习安卓的时候又遇到这个问题,第一次认真搜索了一下,看了很多博文说的不太全面或是没有讲到本质,我只是简单说一下对于电子屏幕来说ppi和dpi的区别。
一、PPI和DPI的概念
先说普通用户接触较多的ppi,英文全称pixels per inch,又叫像素密度,意思是每英寸上的像素数。如图是我画的垃圾图,凑活看,一块1280*720分辨率的5英寸屏幕,意思是横向720个像素,纵向1280个像素,对角线长度5.0英寸,可以计算ppi = sqrt(1280^2+720^2)/5.0 = 293.72。理论上人眼所能分辨的ppi为300,300以上可称视网膜屏,也就是苹果所谓的Retina屏。
然后是开发中用到的dpi,英文全称dots per inch,又叫点密度。dpi是比ppi范围广的多的词,因为只有数码设备才有像素这个概念,其他的比如打印机就只能用dpi衡量。除了点和像素的区别,其他计算方式和ppi是一样一样的。
二、PPI和DPI的区别
理论上对于屏幕而言,点就是像素,像素就是点,ppi和dpi应该没有区别才对,但是对于图里的屏幕,已经计算过ppi=293,跑分软件却显示dpi=320。为什么dpi和ppi会不同?其实这是人为规定的结果。
在开发中使用的dot也就是dpi中的d,如果有一个640d*360d的东西,显示在上述1280*720的屏幕上,严格点对点显示,将正好占据1/4个屏幕,但是在640*360的屏幕上就是占满了整块屏幕。生活中的屏幕分辨率五花八门,点对点显示肯定是行不通的,所以需要按比例显示。先规定基准dpi为160(安卓早期谷歌规定的基准值),还是严格按照定义,1280*720的5寸屏幕ppi=dpi=293,假设有一条80d的线段,那么在这块屏幕上实际点数应该是293/160*80=146.5???出现了半个像素的情况!!!这让屏幕左右为男,显示也不对,不显示也不对。为了避免这种问题,谷歌又规定了几种标准dpi分别为240、320等等,和160dpi的比例分别为1.5、2,293与320最为相近(没有研究具体什么是最为相近),所以规定此屏幕dpi为320。这样只要确保开发中使用的大小即点数必须为偶数,这样再乘以比例就不会出现半个点的情况。
三、总结
总结一下,对于手机屏幕,点和像素是一个意思,理论上ppi和dpi应该是一个东西,但是由于ppi五花八门,在按比例放大的时候会出现半个像素的情况,所以人为规定了几个特殊的dpi取值,比如160、240、320等,完美解决了问题,同时导致手机屏幕的ppi和dpi不再相等。