dpi 编程
一英寸里面有多少个像素点,称之为dpi。为什么要是英寸呢?国际标准计量单位应该是厘米,米,毫米之类的,只能说是科技界还是由西方控制的。
一英寸等于=2.54厘米
为什么要有dpi这种单位?我想是因为想在不同分辨率的平面上,得到大小一样的物品这种需求存在。比如电脑屏幕的默认设置是96dpi(这个是不准确的软件设置),因为不同电脑屏幕的分辨率精细程度是不同的,所以同样是96dpi的设置,显示同一张照片的大小就会不同。如果电脑屏幕精细程度刚好相同,那么显示的大小就应该相同。
如果要让电脑屏幕显示的大小和打印出来的大小相同,比如电脑屏幕是96dpi,打印分辨率是300dpi,一张照片的大小是600×600像素的,在电脑里面显示的尺寸是600 / 96 = 6.25英寸×2.54 = 15.875厘米。而打印出来的大小是600 / 300 = 2 × 2.54 = 5.08 厘米,只是电脑的三分之一大小而已。为了要把打印的大小设置得好像电脑屏幕显示的大小一致,那么必须调整屏幕的dpi或者调整打印的dpi,让两个设备的dpi一致。
可见dpi确实有点用处,不过dpi也容易引起混淆。因为dpi实际上是一个设备的物理特性,和逻辑上的像素是没有关系的。不管是屏幕上,还是纸上的图像,最终的像素都是600×600,只是看上去大小不同而已。而事实上,很多系统并不在乎大小,而只在乎显示的像素。
不管是dpi 96的项目,还是dpi72的屏幕,300×300的窗口,还是300×300的窗口,哪怕大小完全不一样。因此我们需要一个按照大小来做单位的显示系统,而不是一个按照像素来显示的系统。而传统的做法是将dpi96的设备,伪装成dpi72的设备,但是遗憾的是,当你把dpi72调整为96后,相差反而更大了,因为归根结底,系统的底层都是承认分辨率而已,其他不过是软件的缩放。要在dpi72的电脑上显示dpi96的效果,需要把dpi72改为dpi54,这样同一个东西,就会缩小为0.75,显示96的像素,只需要72个像素,刚好在dpi72的物理设备上显示一英寸的东西。
可见系统对于这个dpi的修改,更像是黑客手法。
如果建立一个以物理大小做单位的系统,而不是基于像素的系统,这个就能从根本上解决不同设备的dpi问题。但是并不是所有场合都是以“大小”为主的,有很多场合,像素才是主体。
我认为,UI是最适合用物理单位的地方。因为人们希望在不同设备看到的图像大小应该一致。而那些“内容”并不适合物理单位,因为比如电影经常缩放使用,人们往往希望看到的是像素点一一对应的最佳效果,或者是放大的效果,并不太在乎他的“固有尺寸”。
72之一英寸等于一磅。磅是字体单位。
1丝米(0.1毫米)据说是眼睛的极限分辨率,换算下来一英寸等于254丝米,9磅等于31丝米,是最小的实用字体单位。
建立一个以丝米为单位的UI系统,24寸的绝对高清屏分辨率应该是:5080×2858。
不同字体对应的丝米单位:
1磅 = 1/72英寸 = 3.5丝米
八号 = 5 磅 = 17.6丝米
七号 = 5.5磅 = 19.4丝米
小六 = 6.5磅 = 22.9丝米
六号 = 7.5磅 = 26.4丝米
小五 = 9 磅 = 31.7丝米
五号 = 10.5磅 = 37 丝米
小四 = 12磅 = 42.3丝米
四号 = 14磅 = 49.3丝米
小三 = 15磅 = 52.9丝米
三号 = 16磅 = 56.4丝米
小二 = 18磅 = 63.5丝米
二号 = 22磅 = 77.6丝米
小一 = 24磅 = 84.6丝米
一号 = 26磅 = 91.7丝米
小初 = 36磅 = 127丝米
初号 = 42磅 = 148.1丝米
假设我们建立一个窗口,他是300×300像素的,我们希望程序可以跨设备执行,在不同设备下大小一致,那么就先要求出他对应的物理尺寸。300/96dpi × 254 = 793丝米,然后把这个数值记录下来。在第二个dpi为72的系统下,算出实际的像素应该为 793 / 254 × 72 = 224.
有些时候我们希望能够整体的放大和缩小UI,因此需要一个比例因子。dpi不适合用来做缩放比例因子,因为dpi是一个设备的固有特性,是分辨率(精细程度),而缩放针对的外观的大小,我们希望放大也能保持精细。
比如我们在手机上希望更小的字体,因为手机的屏幕有限,我们可以忍受小字体。而桌面电脑和电视上观看又要求不同的视觉效果。
33厘米据说是普通阅读的健康距离。那么33厘米远的9磅字体,4米(电视观看距离)应该扩大多少呢?
400/33 = 12倍,假设46寸的彩电,效果上等于4寸~~,现在很多数字电视的界面都设置的异常复杂,就是没有考虑到远距离的视觉效果。因为人的眼睛可以调节焦距,所以以上的算法也许存在问题,我感觉大概有4倍左右,12寸差不多了。
案例:
数码相机拍摄的照片,大多是300dpi(视觉极限)的,比如3968×2232像素的一张照片,希望打印和显示的大小一致,那么显示的分辨率应该是:3968×96/300 。。。 1269 × 714。