字体大小:font size参数的实际意义——基于freetype2

描述字体的大小我们常会用三种标准:

  • 像素大小——pixel
  • 物理大小——inch
  • 绝对大小——pt(point 磅)

freetype2中除了显式标记为pixel的,其余size均是以pt为单位,且定义:在现实排版中(如打印时)72 pt = 1 inch

Points are a physical unit, where 1 point equals 1/72 of an inch in digital typography.
——FreeType Glyph Conventions | Glyph Outlines

因为pt是根据现实的物理长度单位inch定义的,所以想要按定义的物理长度呈现在屏幕显示器上,需要知道屏幕设备的dpi(dots per inch 每英寸多少像素点),这个可以通过屏幕的分辨率和实际长宽计算获取。(比如高7.62英寸1080p的屏幕高度上dpi就是141)

有了points per inch(72)1以及dpi(根据设备而定),可以计算出dots per points(dpp),即每个单位字体长度多少个像素,从而进行修正。如此在不同尺寸、不同分辨率的设备上,设置一样的字号可以获得同样物理大小的字体。(比如12磅的汉字在显示器上长宽均为1/6英寸)

反之,我们也可以不使用真实的dpi,而是预设一个期望的dpp(如设置dpi为72,此时dpp为1,在屏幕上1pt = 1px。12磅的字体占12*12的像素,而具体的物理长度未知)。

回到freetype2,font大小的设置接口为:

FT_Set_Char_Size( FT_Face     face,
                    FT_F26Dot6  char_width,
                    FT_F26Dot6  char_height,
                    FT_UInt     horz_resolution,
                    FT_UInt     vert_resolution );

这里char_width、char_height设置字体大小,单位都是pt。后6位用来表示小数部分,所以传入的字号需要乘以64。如果一个参数为0,则另一个参数的值会被拷贝给它使用。

horz_resolution、vert_resolution是需要自定义的dpi,你可以传入根据设备参数算出的dpi,使得屏幕上字体大小可以和实际打印时一样。也可以传入其余数据,设置期望的dpp,让1pt 等于你想要的像素大小。两个参数缺省(=0)一个时和char_width、char_height一样会由另一个拷贝补充,两个都为0时,则会赋予默认值72,此时1pt = 1px。


  1. 这里的point per inch并不是字体设计常见的ppi(pixel per inch),后者往往和dpi等同混用 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我的回答有误。在Pygame中,`pygame.freetype.Font`对象确实没有`set_size`方法,因为这个对象代表的是一个具体的字体文件,而不是一个字体实例。 如果你想要改变字体大小,可以使用`pygame.freetype.SysFont`创建一个字体实例,然后设置它的大小。例如,要创建一个大小为60的Arial字体,你可以这样做: ``` font = pygame.freetype.SysFont('Arial', 60) ``` 在这个例子中,我们使用`pygame.freetype.SysFont`创建了一个Arial字体的实例,并将其大小设置为60。 然后,你可以使用`render_to`方法将文本渲染到屏幕上。例如: ``` font.render_to(screen, (x, y), 'Hello, World!') ``` 其中,`screen`是一个Pygame的Surface对象,`(x, y)`是文本的位置,`'Hello, World!'`是要渲染的文本内容。 你可以在适当的地方使用这些方法来改变字体大小和渲染文本。 ### 回答2: 这个错误是由于使用了pygame.freetype.Font对象的set_size()方法,但是该方法在pygame中并不存在,因此会报错。在pygame中,要设置字体的大小,可以使用pygame.freetype.Font对象的render()方法,并在参数中指定字体的大小,示例代码如下: ```python import pygame import pygame.freetype pygame.init() screen = pygame.display.set_mode((800, 600)) font = pygame.freetype.Font(None, 24) # 创建字体对象,并指定大小为24 text_surface, rect = font.render("Hello, Pygame!", (255, 255, 255)) # 渲染文本,并返回文本表面和矩形区域 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() screen.fill((0, 0, 0)) # 填充背景色 screen.blit(text_surface, (100, 100)) # 在屏幕上绘制文本 pygame.display.flip() # 更新显示 ``` 在上述示例代码中,我们使用pygame.freetype.Font对象的render()方法来渲染文本,并指定字体大小为24。然后将渲染后的文本表面(text_surface)绘制到屏幕上。你可以根据自己的需求来调整字体的大小。 ### 回答3: 这个错误信息是由于在使用pygame的freetype模块中的Font对象时,尝试使用了"set_size"这个方法,但是这个方法在该对象中是不存在的。 在pygame中,通过freetype模块可以使用高级字体渲染功能,例如自定义字体字体大小、颜色等等。但是,与pygame中的普通字体不同,用于渲染的freetype.Font对象没有提供名为"set_size"的方法来设置字体大小。 解决这个问题的方法是使用freetype.Font对象的"set_char_size"方法来设置字体大小。这个方法的参数是一个数字,表示“字符大小”(即字符的高度),单位为像素。调用这个方法后,渲染出的字体将按照指定的大小显示。 下面是一个示例代码: ```python import pygame import pygame.freetype pygame.init() # 创建一个freetype.Font对象 font = pygame.freetype.Font(None) # 使用set_char_size方法设置字体大小为30 font.set_char_size(30) # 渲染文本 surface, rect = font.render('Hello, World!', (255, 255, 255)) # 显示渲染结果 screen = pygame.display.set_mode((400, 300)) screen.blit(surface, (10, 10)) pygame.display.flip() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() ``` 上述代码中,我们使用set_char_size方法设置字体的大小为30。然后渲染了一个文本,并将渲染结果显示在屏幕上。 通过使用set_char_size方法,可以解决'pygame.freetype.Font' object has no attribute 'set_size'的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值