1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
字体字号和dpi的关系.md 7.81 KB
一键复制 编辑 原始数据 按行查看 历史

字体字号和dpi的关系

〇、前言

现在高分屏被广泛采用,但是小伙伴们发现高分辨率下面字体会变得很小,就开始黑高分屏是废品了。或者你听过dpi,但是不甚了解和字体之间存在什么关系,这篇文章就来讨论一下这个问题。

一、字体字号、点数pt、dpi的关系

字号是打印行业采用的单位制,字号对应点数,点数对应的是尺寸。

公式如下:

  1. 1pt=0.35146mm 这个神奇的数字怎么来的?其实是基于:
    1. 1pt = 1/72in
    2. 1in = 2.54cm
    3. 1pt = 1/722.5410 =0.3527……

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 得

  • 显示器:40cm:150dpi对应分辨率和尺寸15in:1080p或29in:4k
  • 电视机:120cm:50dpi对应分辨率和尺寸44in:1080p或85in:4k

当然,有些人视力比较好,有些人视力比较差,可以上下浮动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,统一在各种设备中的视觉体验。

安卓手机采用类似的机制。

三、linux 设置正确的dpi

以下内容以debian + KDE桌面为例子。

3.1 获取当前dpi信息

  1. xdpyinfo | grep men 获取分辨率和尺寸
  2. xdpyinfo | grep reso 获取dpi

3.2 xrandr设置dpi

xrandr --dpi 138 设置正确的dpi(nvidia暂不支持)

这个dpi数值怎么取得?拿尺子量一下,分辨率/尺寸(英寸:2.54厘米)。比如我的宽分辨率是3840,70厘米,即 3840/70×2.54=139.33……这个数值不需要太精确,取6的整倍数,即138。

3.3 lightdm自动设置dpi

如果你的窗口启动器是lightdm,那么可以修改/etc/lightdm/lightdm.conf,将里面的xserver-command这行修改为: xserver-command=X -dpi 138

这样就不需要你每次手动输入命令了。

3.4 nvidia显卡设置

nvidia显卡比较麻烦:

  1. sudo nvidia-settings 打开nvidia设置面板。 nvidia x server settings

右下角的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桌面的应用。

3.5 GTK/GNOME程序修正dpi

只需要添加一个环境变量:

#这是一个比例参数,以dpi96为基础,138/96=1.4357
export GDK_DPI_SCALE=1.4357 

添加到以下文件后面即可:

  • /etc/profile
  • ~.profile

备注:以上方法在deepin中无效,在debian+kde中有效,暂时还不知道deepin中dpi设置的机制。

参考

  1. 屏幕dpi计算器:https://www.sven.de/dpi/
  2. Ubuntu下调整DPI达到字体美化: https://www.cnblogs.com/wadesong/articles/4976198.html
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助