How would I center-align (and middle-vertical-align) text when using PIL?
Advertisement
Answer
Deprecation Warning: textsize is deprecated and will be removed in Pillow 10 (2023-07-01). Use textbbox or textlength instead.
Code using textbbox
instead of textsize
.
from PIL import Image, ImageDraw, ImageFont def create_image(size, bgColor, message, font, fontColor): W, H = size image = Image.new('RGB', size, bgColor) draw = ImageDraw.Draw(image) _, _, w, h = draw.textbbox((0, 0), message, font=font) draw.text(((W-w)/2, (H-h)/2), message, font=font, fill=fontColor) return image
myFont = ImageFont.truetype('Roboto-Regular.ttf', 16) myMessage = 'Hello World' myImage = create_image((300, 200), 'yellow', myMessage, myFont, 'black') myImage.save('hello_world.png', "PNG")
Result
Use Draw.textsize
method to calculate text size and re-calculate position accordingly.
Here is an example:
from PIL import Image, ImageDraw W, H = (300,200) msg = "hello" im = Image.new("RGBA",(W,H),"yellow") draw = ImageDraw.Draw(im) w, h = draw.textsize(msg) draw.text(((W-w)/2,(H-h)/2), msg, fill="black") im.save("hello.png", "PNG")
and the result:
If your fontsize is different, include the font like this:
myFont = ImageFont.truetype("my-font.ttf", 16) draw.textsize(msg, font=myFont)