无法将文本与图像上的线对齐

4 投票
2 回答
1031 浏览
提问于 2025-04-18 09:13

我正在使用Python的Pillow库(PIL的一个分支)进行一些图像处理,但遇到了一个奇怪的问题。奇怪的是,当我尝试在同一个y坐标上画一条线和一些文字时,它们并没有对齐。文字的位置比线稍微低一点,尽管我两个图形都是从同一个点开始的。有没有人遇到过这个问题,或者知道怎么解决吗?这是我使用的代码:

image = Image.open("../path_to_image/image.jpg")

draw = ImageDraw.Draw(image)

font = ImageFont.truetype("../fonts/Arial Bold.ttf", 180)

draw.line((0,2400, 500,2400), fill="#FFF", width=1)
draw.text((0, 2400), "Test Text", font=font) 

image.save(os.path.join(root, "test1.jpg"), "JPEG", quality=100)

return

2 个回答

0

对于遇到类似问题的人,我最终创建了一个辅助函数,这个函数会手动调整字体大小,直到font.getsize(text)[1]返回正确大小的文本。下面是一个代码片段:

def adjust_font_size_to_line_height(font_location, desired_point_size, text):
    adjusted_points = 1

    while True:
        font = ImageFont.truetype(font_location, adjusted_points)
        height = font.getsize(text)[1]

        if height != desired_point_size:
            adjusted_points += 1
        else:
            break

    return adjusted_points
3

我遇到了类似的情况(尺寸小了10倍):

example test1.jpg output

这个问题发生的原因是,给ImageDraw.text()的(x,y)坐标实际上是文本的左上角

PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None)

在指定的位置绘制字符串。

参数:

  • xy – 文本的左上角坐标。
  • text – 要绘制的文本。
  • font – 一个ImageFont实例。
  • fill – 用于文本的颜色。

这一点在代码中得到了确认:文本会被转换成位图,然后在xy位置绘制。

撰写回答