我试着用枕头把文本放在盒子的中心.我已经按照这stackoverflow post中的说明进行了操作,得到了预期的结果.但是,如果我在文字之间添加换行符,文本的大小将无法正确调整,并且会偏离中心.
以下是没有换行符的代码示例:
title_text = "Hello World"
img = Image.new(size=(400, 300), mode='RGB')
draw = ImageDraw.Draw(img)
font_path = "/content/Charlie don't surf.ttf"
# draw white rectangle 200x100 with center in 200,150
draw.rectangle((200-100, 150-50, 200+100, 150+50), fill='white')
draw.line(((0, 150), (400, 150)), 'gray')
draw.line(((200, 0), (200, 300)), 'gray')
# find font size for text `"Hello World"` to fit in rectangle 200x100
selected_size = 1
for size in range(1, 150):
title_font = ImageFont.FreeTypeFont(font_path, size=size)
w, h = title_font.getsize(title_text)
if w > 200 or h > 100:
break
selected_size = size
# draw text in center of rectangle 200x100
title_font = ImageFont.FreeTypeFont(font_path, size=selected_size)
draw.text((200-(w//2), 150-h//2), title_text, fill='red', font=title_font)
display(img)
请注意,文本居中并根据需要调整大小.
但如果我把title_text = "Hello World"
改为title_text = "Hello\nWorld"
,加上一个换行符.我明白了:
title_text = "Hello\nWorld"
img = Image.new(size=(400, 300), mode='RGB')
draw = ImageDraw.Draw(img)
font_path = "/content/Charlie don't surf.ttf"
# draw white rectangle 200x100 with center in 200,150
draw.rectangle((200-100, 150-50, 200+100, 150+50), fill='white')
draw.line(((0, 150), (400, 150)), 'gray')
draw.line(((200, 0), (200, 300)), 'gray')
# find font size for text `"Hello World"` to fit in rectangle 200x100
selected_size = 1
for size in range(1, 150):
title_font = ImageFont.FreeTypeFont(font_path, size=size)
w, h = title_font.getsize(title_text)
if w > 200 or h > 100:
break
selected_size = size
# draw text in center of rectangle 200x100
title_font = ImageFont.FreeTypeFont(font_path, size=selected_size)
draw.text((200-(w//2), 150-h//2), title_text, fill='red', font=title_font)
display(img)
请注意,使用换行符时,文本的大小没有正确调整,也没有居中.显然,.getsize()
方法不能很好地处理换行.
我正在使用Pillow 7.1.2版本,并在Google Colab笔记本中运行所有这些(这就是我运行display(img)
的原因).
我能做些什么来解决这个问题?我的最终目标是使用Python为游戏创建卡片.一些卡片有两个单词,而其他卡片只有一个单词.我希望我的代码能够调整大小和中心的文字,无论字数.
编辑:经过一些测试,我注意到.getsize()
将字符串"Hello\nWorld"
视为一行文本,而不是两行.我的问题可能是:如何获得带有换行符的文本的大小?