通过把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中看到了这个:
即:对于垂直文本排列,基线是垂直的,与垂直轴一致。