pygame.font.Font().render() 计算基线(baseline)的原点(origin)坐标

通过把dir(pygame.font.Font())和dir(pygame.font.Font().render())打印出来后,挨个尝试。并使用多个字母试验后,终于找到计算字母或字符串基线的方法(基线的原点相对于图片的左上角(0,0)的坐标,即下图中的origin相对于整个图片左上角的位置)。非常复杂,所以记录下来。

myfont = pygame.font.Font(None, 70)

结论1、我发现myfont.get_ascent()在所有的实验中都等于origion的y坐标值。

结论2、不使用myfont.get_ascent()的,比较有把握的方法:

①参考https://blog.csdn.net/qq_41556318/article/details/86303502(已私藏)中pygame.font.Font.metrics()的解释:

获取字符串参数每个字符的参数。

metrics(text) -> list

返回一个列表,包含每个字符的属性元组。形式如:[(minx, maxx, miny, maxy, advance), (minx, maxx, miny, maxy, advance), ...] 

元组内各个元素的含义如下图:

列表内不可识别的字符对应的元组内参数均为 None。

import pygame as pg
py.init()
myfont = pg.font.Font(None, 70) # None会调用默认的自带的字体
yy0 = myfont.size('j')  # yy1: <class tuple>: (27, 49)
yy1 = myfont.metrics('j')  # yy1: <class 'list'>: [(-1, 10, -10, 35, 13)]  
                            # -> [(minx, maxx, miny, maxy, advance), (minx, 
                              # maxx, miny, maxy, advance), ...] 
textImage = myfont.render('j', True, (255, 0, 0))

yy3 = textImage.get_rect()  # yy3: <rect(0, 0, 14, 49)> -> (x1, y1, x2, y2) 
                          #而且偶然的机会,测得[x1, x2) [y1, y2)是前闭后开的
yy4 = textImage.get_bounding_rect()  # yy4: <rect(0, 4, 11, 45)>  ->  (x1, y1, w, h)


我经过实验,发现其他的属性和方法对于找到origin都没有帮助。
1、可以看到yy4中 x1 + w = yy3的14
           yy4中 y1 + h = yy3的49
2、根据图可知,x方向上,相对于纵向的baseline,向x的负方向,x的值为负;
              y方向上,相对于横向的baseline, 向y的正方向,y的值为负;
              所以x和y方向上计算origin的加和减运算是不同的(见3中minx, miny前的 
              加号和减号),清楚这一点可以防止思考时混乱。
3、yy4_y1 + h + miny  就是origin相对于左上角的y坐标;
   yy4_x1 + w - minx  就是origin相对于左上角的x坐标。
   以y方向为例稍微解释一下:yy4_y1 + h得到的是 字没有外扩的bbox的右下角  相对于 外扩后的图像的左上角(0, 0)  的y值,
   miny是字没有外扩的bbox的右下角 相对于 origion的y值 的y值; 
   所以可以通过这两个值,计算出origion相对于外扩后的图像的左上角(0, 0)  的y值

 

仔细想了一下,好像直接使用textImage.get_bounding_rect()的结果就行了,就已经是紧贴字的bbox了,没必要再去寻找baseline了。找到baseline也是为了计算这个外接bbox。


补充:在https://blog.csdn.net/qq_26093511/article/details/60756488中看到了这个:

即:对于垂直文本排列,基线是垂直的,与垂直轴一致。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值