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

关于Python Pillow库文本坐标是否基于文本中心的技术问询

Pillow文本坐标基准说明

Pillow的文本坐标默认不是以文本自身中心点为基准,而是以文本的左上角作为锚点。这是初次使用时容易踩的坑,也是你文本位置不符合预期的核心原因。

默认行为

ImageDraw的text()方法中,传入的(x, y)参数默认对应文本块左上角的坐标。比如调用draw.text((100, 100), "Test", ...),文本的左上角会落在(100,100)的位置,而非中心点。

实现中心点定位的两种方法

1. 手动计算偏移量(兼容全版本)

先获取文本的边界尺寸,再根据目标中心点坐标反推左上角位置:

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGB', (500, 300), 'white')
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('simhei.ttf', 40)
text = "测试文本"

# 获取文本边界框(Pillow 8.0+推荐用textbbox)
bbox = draw.textbbox((0, 0), text, font=font)
text_w = bbox[2] - bbox[0]
text_h = bbox[3] - bbox[1]

# 目标中心点坐标
target_center = (250, 150)
# 计算左上角坐标
left_x = target_center[0] - text_w // 2
top_y = target_center[1] - text_h // 2

draw.text((left_x, top_y), text, font=font, fill='black')
img.save('center_text.png')

如果你的Pillow版本低于8.0,可用textsize()替代textbbox():

text_w, text_h = draw.textsize(text, font=font)

2. 使用anchor参数(Pillow 8.0+)

Pillow 8.0及以上版本支持通过anchor参数直接指定锚点位置,其中anchor="mm"代表以文本的水平和垂直中心点为锚点,无需手动计算:

draw.text((250, 150), text, font=font, fill='red', anchor='mm')

常见的锚点取值还有:lt(左上,默认)、rt(右上)、lb(左下)、rb(右下)等,可根据需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:22:34