如何将字体单位(一定字体大小)转换为像素?

问题描述 投票:0回答:1

我有一个font.ttf,当使用具有一定字体大小的字体时,我需要计算其单位为像素的值,比如说100,

如您所见,这是某些用于字体编辑的软件中的字形,并且所选坐标以字体单位表示,这些单位是动态的,使用时字体有多大,是否有一个方程来计算使用字体时以像素为单位的单位给定尺寸?

示例

fonts python-imaging-library font-size truetype
1个回答
5
投票

这里要理解的一个关键单位是em。它建立了您在字体设计工具中看到的轮廓单位与用于光栅化字形的像素数之间的联系。

OpenType / TrueType 字体中的字形轮廓是在网格上设计的,设计者在字体范围内设置该网格的大小。网格设置为一定数量的字体设计单位per em (UPM)。例如,字体设计者可能会指定每个 em 1000 个字体单位,或每个 em 2048 个字体单位。该值存储在字体中。

请注意,这并不能确定字形的大小。假设使用每 em 2048 个单位创建字体。像“X”这样的字符的字形从下到上可能是 1000 个单位,也可能是从下到上 3000 个单位。每 em 的单位不限制可使用的网格的总大小,或网格内轮廓的大小。

当您在文本编辑器、文字处理应用程序或桌面出版应用程序(例如记事本、Word、Pagemaker)中设置文本大小时,应用程序通常会使用“点”单位。打印机点是一个物理单位,大约为 1/72 英寸;在数字类型中,一个点正好是 1/72 英寸。但是当您选择文本大小时,您实际设置的是 points per em

因此,假设一种字体是用每个 em 1000 个字体设计单元的网格设计的;并假设在应用程序中文本大小设置为 18 点(每 em)。 18 点为 0.25";因此 em 的 1000 个设计单位对应于 0.25"。或者,如果文本大小设置为 144 点,则 em 的 1000 个设计单位对应于 2"。

您的问题的另一个重要因素是多少个显示像素对应于“英寸”。至少,实际显示器的物理像素密度是每物理英寸像素数的一部分。但另一个因素可能是主机操作系统应用的缩放,这可能取决于显示器外形尺寸和预期观看距离。例如,27 英寸 4K 桌面显示器可能会在不到两英尺的距离内观看;在 55 英寸 4K 电视上显示时,内容会在十英尺左右的距离内观看。电视的像素密度约为台式显示器的一半,但典型的观看距离更像是桌面显示器的五倍远。因此,在确定内容的逻辑英寸与显示器上的物理英寸的关系时,需要考虑所有这些因素。

更复杂的是,软件可能具有与显示物理像素不同的“逻辑”像素概念。体现这一点的一种方式是软件中的“显示分辨率”设置。因此,例如,LCD 显示器的物理像素分辨率可能为 1920 x 1024,但软件可能设置为假定分辨率为 1024 x 768。(当然,对于该配置,应用程序将假设 1024 x 768 进行绘制) 768 显示,但每个像素的内容需要以某种方式映射到物理像素上,可能有不同的管理方式。)

最终,重要的是软件假设的(逻辑上)是显示器的尺寸(以像素为单位)和每“英寸”的像素数(PPI)。字体光栅化器中设置的是pixels per em

。设计者的轮廓根据假定的每面像素 (PPEM) 缩放到网格上。

所以: 字体设计师为每个em设置字体设计单位

应用程序设置文本大小(以点/em为单位)

    每场 72 分
  • 操作系统(或驱动显示器的任何软件)假定每英寸有一定数量的像素
  • 并且:
  • ppem 像素/em

=(文本大小 pts / em)*(1 英寸/72 点)*(逻辑 ppi 像素/英寸)

=(文本大小 * 逻辑 ppi / 72)像素 / em

现在,如果您查看字形轮廓数据中某些特征的大小,您可以使用上述作为因子,从设计单位中该特征的大小获取到(逻辑)像素中该特征的大小。

(特征尺寸单位)*(1 em / 字体 upm 单位)*(ppem 像素 / em)

=(特征大小 * ppem / 字体 upm)像素

例如,如果文本大小为 12 pts,ppi 为 120,则意味着 ppem 为 20 像素/em。然后,假设字体的 UPM 为 1000,“X”轮廓的高度为 600 个单位。以像素为单位,“X”字形将为 (600 * 20 / 1000 =) 12 像素高。

© www.soinside.com 2019 - 2024. All rights reserved.