You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Pillow字体对象getbbox方法返回值的疑问

关于Pillow 9.3.0中ImageFont.getbbox返回值的解释

首先明确getbbox(text)返回的是文本像素范围的边界框,格式为(left, top, right, bottom),对应图像坐标系(原点在左上角,y轴向下)。下面针对你的疑问逐一解释:

1. 为什么top值不是0?

图像坐标系的原点(0,0)是画布左上角,但字体的字符布局是基于**基线(baseline)**设计的——基线是大多数小写字母底部对齐的那条线。对于小写字母组成的test,字符的顶部并没有延伸到画布最顶端(y=0的位置),所以边界框的top值(文本最顶端的y坐标)会大于0。你得到的top=2,意味着从画布左上角往下2个像素才是这段文本的最顶部位置。

2. 为什么bottom值不等于设定的字号7?

你设置的font_size=7指的是字体的em框大小(字体设计中的基准框),但实际文本的边界框高度(bottom - top)不一定等于em框大小:

  • 字体的实际字符范围(升部高度+降部高度)通常由字体设计师决定,会和em框存在细微差异;
  • 你得到的bottom=8,计算文本高度为8-2=6,这说明test这段文本的实际像素高度是6,和字号的差异属于正常情况——字号是设计基准,并非实际字符的像素高度。

3. 关于源码注释描述的(0, 0, width, height)

这个注释大概率是旧版本的遗留内容,或是针对特定场景(比如无升/降部的字符、部分特殊字体)的理想情况。在Pillow 9.3.0中,getbbox已更新为返回文本实际的像素边界框,而非固定的(0,0,width,height)。你可以验证:如果输入包含带降部的字符(比如y、g),bottom值会更大;如果输入大写字母(比如TEST),top值会更接近0。

补充验证代码

你可以运行这段代码,对比不同文本的边界框差异:

from PIL import ImageFont

font_name = '/System/Library/Fonts/HelveticaNeue.ttc'
font_size = 7
font = ImageFont.truetype(font_name, font_size)

print("test的bbox:", font.getbbox('test'))
print("TEST的bbox:", font.getbbox('TEST'))
print("testyg的bbox:", font.getbbox('testyg'))

内容的提问来源于stack exchange,提问作者user17647940

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:30:54