现在高分屏被广泛采用,但是小伙伴们发现高分辨率下面字体会变得很小,就开始黑高分屏是废品了。或者你听过dpi,但是不甚了解和字体之间存在什么关系,这篇文章就来讨论一下这个问题。
字号是打印行业采用的单位制,字号对应点数,点数对应的是尺寸。
公式如下:
in 即英寸,等于2.54厘米,25.4毫米。
另外,字号和点数的关系如下:
序号 | 号数 | 点数(pt) | 大小(mm) |
---|---|---|---|
1 | --- | 72 | 25.31 |
2 | 大特号 | 63 | 22.14 |
3 | 特号 | 54 | 18.98 |
4 | 初号 | 42 | 14.76 |
5 | 小初号 | 36 | 12.65 |
6 | 大一号 | 31.5 | 11.07 |
7 | 一号 | 28 | 9.84 |
8 | 二号 | 21 | 7.38 |
9 | 小二号 | 18 | 6.33 |
10 | 三号 | 16 | 5.62 |
11 | 四号 | 14 | 4.92 |
12 | 小四号 | 12 | 4.22 |
13 | 五号 | 10.5 | 3.69 |
14 | 小五号 | 9 | 3.16 |
15 | 六号 | 8 | 2.81 |
16 | 小六号 | 6.875 | 2.42 |
17 | 七号 | 5.25 | 1.85 |
18 | 八号 | 4.5 | 1.58 |
一般来说,小四号(12pt)做中文正文打印是不错的,英文五号(10.5pt)或者小五号(9pt)也可以。
然后,dpi在这里扮演什么角色?dpi即每英寸点数(dots per Inch),系统并不知道显示器的物理尺寸是多少,它通过dpi反推显示器的大小,比如当你设置dpi等于96,分辨率即像素(px)为:1920×1080,即1920/96=20in、1080/96=11.25in、比例是11.25/20*16=9即16:9。
同样的,系统也是通过dpi的设置来推算每个点pt对应的像素点px是多少,1/72:1/96 = 1/72/(1/96)= 1/72*96=96/72=1.3。比如小四12pt,系统计算出应该用16个像素点px来显示,尺寸才是4.22mm。
由此可以知道,pt说的是物理尺寸,和in,cm,mm等单位没什么不同。而像素px不是尺寸单位,他是没有大小的点,而dpi是物理尺寸和像素点之间的桥梁,让系统获得像素点的尺寸信息。如果这个dpi设置不正确,在电脑中pt是没有意义的(物理上)。
虽然这看上去也不算太复杂,但是dpi和pt的对应关系,往往存在一个假设dpi。比如当设计者设计字体大小的时候,它的像素点和物理尺寸的对应关系,即dpi应该是多少?要知道,点并不是一个数学点,因为一条线的点可以无数个,因此必然要赋予设计者可以使用的,具有物理大小的点,本质就是要求有一个设计时的类似dpi的东西。设计时候的dpi和使用时的dpi常常是出现偏差的,这时就要重新计算设计时候的pt是多少。
比如字体文件虽然写着12pt,但这个pt必然是基于某个dpi的,系统通过自己的dpi和设计时的dpi,计算真正的pt是多少。比如,系统dpi是163, 字体文件内的12pt会在系统中会显示7pt,即163×(7/12)=95,因此,可以得知字体文件设计一般采用的是96dpi(windows系统默认值)。如果你的系统对这个进行了这个修正,说明它还是挺智能的,如果直接采纳字体12pt,这个pt是没有物理尺寸意义的。
并不是所有系统,也不是所有应用,都会设置正确的dpi,所以在电脑中pt这个单位经常是没有物理尺寸意义的。
以上是显示问题的原因之一,另一点pt并不是个很常用的单位,除了字体,其他ui元素一般直接使用像素点px。
px虽然没有尺寸意义,但是有“分辨率”的意义。比如一幅画2cm×2cm,但是只有两个像素点,虽然你能看到这个画,但是完全分辨不出画的内容。反之,分辨率有800×800,但尺寸只有2mm×2mm,估计也要拿放大镜才能看清楚。因此,这两个其实都有实际意义的。如何结合尺寸和分辨率,获得一个比较优秀的单位?
以上问题实质是观察者离画面距离造成的,如果你站得远,画面变小,“分辨率”不变,但也会造成实际可识别变难。这可以用视角来表达,也就是所谓的近大远小,但人眼并不是固定的,眼球看远处和近处的曲张会发生改变。不深究这些。比如手机离眼睛十几二十厘米的距离下,300dpi是乔布斯认为的视网膜屏,超过300dpi是不可识别的,无意义的。同理,其他距离下也有类似的dpi机制,这个和视距有关系。
设手机:20cm:300dpi对应分辨率和尺寸7in:1080p 得
当然,有些人视力比较好,有些人视力比较差,可以上下浮动50%。以上dpi说明了什么问题?就是不同距离下的可识别极限dpi是不一致的,也就是字体大小在不同距离下实际的观感是有差别的。因此求在不同距离下保持相对一致的观感,实际上就是要想办法换算一下这个依照极限dpi理论的相对值。比如显示器下12pt是理想值,那么手机6pt就应该是一个理想值,电视机36pt才是一个理想值。
但是这样pt单位就不能在不同设备上统一的描述一致体验了,因此应该设计一个比例值,如150dpi是标准1,手机设置为2,电视机设置为0.33。设这个单位叫dp。 然后可以运算:手机12dp/2= 6pt、电脑12pd/1= 12pt、电视机12pt/0.33= 36pt。这样就可以用dp单位代替pt和px,统一在各种设备中的视觉体验。
安卓手机采用类似的机制。
以下内容以debian + KDE桌面为例子。
1. `xdpyinfo | grep men` 获取分辨率和尺寸
2. `xdpyinfo | grep reso` 获取dpi
xrandr --dpi 138
设置正确的dpi(nvidia暂不支持)
这个dpi数值怎么取得?拿尺子量一下,分辨率/尺寸(英寸:2.54厘米)。比如我的宽分辨率是3840,70厘米,即 3840/70×2.54=139.33……这个数值不需要太精确,取6的整倍数,即138。
如果你的窗口启动器是lightdm,那么可以修改/etc/lightdm/lightdm.conf,将里面的xserver-command这行修改为:
xserver-command=X -dpi 138
这样就不需要你每次手动输入命令了。
nvidia显卡比较麻烦:
sudo nvidia-settings
打开nvidia设置面板。右下角的save to x configuration file
按钮就是输出nvidia的X window system
配置。注意,接下来是高危操作,如果有问题,删除配置。
保存配置为/etc/X11/xorg.conf
,修改配置:
在Section "Screen"
节,添加:
Option "DPI" "138 x 138"
在Section "Monitor"
节,添加:
DisplaySize 707 398
这个是以毫米为单位的尺寸,不过好像没啥用。这个设置对qt程序有效果,但是gtk程序无视这个。比如code和那些gnome桌面的应用。
只需要添加一个环境变量:
export GDK_DPI_SCALE=1.4357 #这是一个比例参数,以dpi96为基础,138/96=1.4357
添加到以下文件后面即可:
备注:以上方法在deepin中无效,在debian+kde中有效,暂时还不知道deepin中dpi设置的机制。