Python PIL 绘制文本偏移

2 投票
3 回答
3243 浏览
提问于 2025-04-18 07:28

我尝试用Python的PIL库在一张图片上画一个字符。使用ImageDraw.Draw.text()这个函数时,xy参数是指文本的左上角位置。但是我把xy设置为(0,0),结果字符并没有画在图片的左上角。

from PIL import ImageFont, ImageDraw, Image 

imageSize=(40,40)
mage = Image.new("RGB", imageSize, (0,0,0))
draw = ImageDraw.Draw(image)
txt = "J"
font = ImageFont.truetype("ANTQUAB.ttf",35)
draw.text((0,0), txt, font=font) 

这是为什么呢?

3 个回答

0

这段代码:

from PIL import ImageFont, ImageDraw, Image 

imageSize=(100,100)
image = Image.new("RGB", imageSize, (0,0,0))
draw = ImageDraw.Draw(image)
txt = "J"
font = ImageFont.truetype("ARIAL.ttf",35)
draw.text((0,0), txt, font=font) 
image.show()

生成了这个:

在这里输入图片描述

这是不是你预期的结果呢?

1

看起来不同字体有不同的偏移量;你可以通过 FreeTypeFont.getbbox() 返回的 "top" 值来获取垂直偏移量。在调用 draw.text 时,把这个偏移量从你的 y 坐标中减去,就能让文字的顶部和图片的顶部对齐。

from PIL import ImageFont, ImageDraw, Image

text = 'J'
font = "arial.ttf"
fontsize = 12

img_w = 100
img_h = 100
canvas = Image.new('RGBA', size=(img_w,img_h), color='white')
draw = ImageDraw.Draw(canvas)
y_text = 0

font_obj = ImageFont.truetype(font, fontsize)
(left, top, right, bottom) = font_obj.getbbox(text)

x_pos = 0
y_pos = 0

# offset the y coordinate in the draw call by the "top" parameter fromgetbbox; this is the font-specific text padding
draw.text(xy=(x_pos, y_pos-top), 
            text=text, 
            font=font_obj,
            align='left', 
            fill='black')

canvas.show()
2

draw.text() 这个函数里的 xy 参数表示文本的左上角位置(文档)。不过,字体周围可能会有一些空白,特别是上下的空白。为了处理这个问题,我把这个位置的 y 值设置成了一个负数(大概是 -5 左右吧),这样就解决了我的问题。

撰写回答