枕头,如何将文本放在图像的中心

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枕头,如何将文本放在图像的中心相关的知识,希望对你有一定的参考价值。

我使用Pillow(PIL)6.0并在图像中添加文本。我想把文字放在图像的中心。这是我的代码,

import os
import string
from PIL import Image
from PIL import ImageFont, ImageDraw, ImageOps

width, height = 100, 100

text = 'H'
font_size = 100

os.makedirs('./{}'.format(text), exist_ok=True)

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)

img.save('H.png')

Here is the output:

enter image description here

Question:

文本水平居中,但垂直居中。如何将其水平和垂直放在中心?

答案

文字总是在字符周围有一些额外的空间,例如如果我们创建的盒子是为'H'报告的确切大小

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
# draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)
# img.save('H.png')
img2 = Image.new("L", (w, h), color=0)   # "L": (8-bit pixels, black and white)
draw2 = ImageDraw.Draw(img2)
draw2.text((0, 0)), text=text, fill='white', font=font)
img2.save('H.png')

给出边界框:

enter image description here

知道线高通常比字形/字符大20%(+一些试验和错误),我们可以计算出额外空间的范围。 (宽度的额外空间是均匀分布的,因此对于居中而言并不感兴趣)。

draw2.text((0, 0 - int(h*0.21)), text=text, fill='white', font=font)

它将'H'移到顶部:

enter image description here

将其重新插入原始代码:

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
h += int(h*0.21)
draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)
img.save('H.png')

得到:

enter image description here

0.21因子通常适用于相同字体的大范围字体。例如。只需插入字体大小30:

enter image description here

以上是关于枕头,如何将文本放在图像的中心的主要内容,如果未能解决你的问题,请参考以下文章

将图像放在表格的中心,如果有额外的文字,图像下方的文字应该在新行中

枕头,添加和旋转图像中的文本

Flutter:如何将文本小部件中心放在屏幕上

Android Button 将图像置于中心,将文本置于底部

如何使枕头文字不会离开屏幕

如何从图像叠加中垂直居中文本