【问题标题】:how to convert font units (with certain font size) to pixels?如何将字体单位(具有一定字体大小)转换为像素?
【发布时间】:2021-07-15 11:58:50
【问题描述】:

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

如您所见,这是某些用于字体编辑的软件中的字形,并且所选坐标以字体单位呈现,这与使用时字体的大小是动态的,是否有一个方程式可以计算字体时的像素单位与给定大小一起使用?

example

【问题讨论】:

  • 在纸上打印时,72 磅字体的大写字母高 1 英寸。 72 磅字体的实际大小取决于显示设备上每英寸的像素数。
  • @GilbertLeBlanc 并不是那么简单。从历史上看,字体高度不是特定字母的高度,而是印在上面的 slug 的高度。它是相邻行之间的默认 间距。我认为即使在今天,具有相同点大小的不同字体的字符高度也会因字体设计者的不同而有很大差异。 “点”的定义本身在历史上经历了多次修改,见en.wikipedia.org/wiki/Point_(typography)

标签: fonts python-imaging-library font-size truetype


【解决方案1】:

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

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

请注意,这并不能确定字形的大小。假设一个字体是使用 2048 个单位/em 创建的。像“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 桌面显示器很可能在不到 2 英尺的距离内观看;在 55 英寸 4K 电视上显示时,内容将在 10 英尺左右的距离内观看。电视的像素密度约为台式显示器的一半,但典型的观看距离更像是距离的五倍。因此,在确定内容的逻辑英寸与显示器上的物理英寸之间的关系时,所有这些都会被考虑在内。

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

最终,重要的是软件假设,逻辑上是显示器的尺寸(以像素为单位)和每“英寸”的像素数 (PPI)。在字体光栅化器中设置的是 pixels per em。设计师的轮廓会根据假定的每 em 像素 (PPEM) 缩放到网格上。

所以:

  • 设计师为每个 em 设置字体设计单位
  • 应用程序以每 em 点数为单位设置文本大小
  • 72 分/em
  • 操作系统(或驱动显示器的任何软件)假定每英寸有一定数量的像素

还有:

ppem 像素/em

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

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

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

(特征大小单位)*(1 em / font-upm 单位)*(ppem 像素/em)

= (feature-size * ppem / font-upm) 像素

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-06
    • 2011-08-17
    • 2013-04-26
    • 2012-04-08
    • 2016-06-10
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多