pin_drop当前位置:知识文库 ❯ 图文
Pillow ImageFont字体教程 - 加载字体文字尺寸与居中绘制详解
一、ImageFont字体概述
ImageFont模块用于指定ImageDraw绘制文字时的字体样式和大小。Pillow支持TrueType字体(.ttf/.otf)和默认位图字体。通过ImageFont.truetype()可以加载系统字体文件,实现自定义字体大小和样式的文字渲染。
这是生成美观文字图像的关键模块,广泛应用于海报制作、证书生成、数据可视化等场景。
二、字体加载语法与参数
加载TrueType字体
代码示例
from PIL import ImageFont
# 加载TrueType字体
font = ImageFont.truetype(font=None, size=10, index=0, encoding='')
# 加载默认字体
font = ImageFont.load_default()truetype() 参数
load_default() 说明
无参数,加载Pillow内置的默认位图字体。这种字体大小固定,无法调整,只适合简单场景。
三、代码示例演示
示例1:使用不同字体大小绘制文字
演示默认字体和TrueType字体不同大小的效果:
代码示例
from PIL import Image, ImageDraw, ImageFont
img = Image.new('RGB', (400, 300), color='white')
draw = ImageDraw.Draw(img)
# 使用默认字体
default_font = ImageFont.load_default()
draw.text((10, 10), "默认字体", fill='black', font=default_font)
# 使用TrueType字体不同大小
try:
font_20 = ImageFont.truetype("arial.ttf", 20)
font_30 = ImageFont.truetype("arial.ttf", 30)
font_40 = ImageFont.truetype("arial.ttf", 40)
draw.text((10, 40), "20号字体", fill='red', font=font_20)
draw.text((10, 80), "30号字体", fill='blue', font=font_30)
draw.text((10, 130), "40号字体", fill='green', font=font_40)
print("TrueType字体加载成功")
except OSError:
print("未找到arial.ttf,使用默认字体")
img.save('fonts.png')输出:
代码示例
TrueType字体加载成功示例2:获取文字尺寸
使用getbbox()和getlength()获取文字尺寸信息:
代码示例
from PIL import Image, ImageDraw, ImageFont
try:
font = ImageFont.truetype("arial.ttf", 24)
except OSError:
font = ImageFont.load_default()
# 获取文字边界框 (left, top, right, bottom)
text = "Hello Pillow"
bbox = font.getbbox(text)
print(f"边界框: {bbox}")
print(f"文字宽度: {bbox[2] - bbox[0]}")
print(f"文字高度: {bbox[3] - bbox[1]}")
# 获取文字长度
length = font.getlength(text)
print(f"文字长度: {length:.2f}")输出:
代码示例
边界框: (0, 5, 143, 23)
文字宽度: 143
文字高度: 18
文字长度: 143.00示例3:文字居中绘制
计算文字尺寸并实现精确居中:
代码示例
from PIL import Image, ImageDraw, ImageFont
img = Image.new('RGB', (400, 200), color='navy')
draw = ImageDraw.Draw(img)
try:
font = ImageFont.truetype("arial.ttf", 36)
except OSError:
font = ImageFont.load_default()
text = "CENTER"
bbox = font.getbbox(text)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
# 计算居中位置
x = (img.width - text_width) // 2
y = (img.height - text_height) // 2
draw.text((x, y), text, fill='white', font=font)
print(f"文字居中位置: ({x}, {y})")
img.save('center_text.png')输出:
代码示例
文字居中位置: (121, 70)四、实际应用场景
-
海报与宣传图:生成带文字的海报或宣传图,需要精确控制字体大小和位置。
-
证书与奖状:制作证书或奖状,在模板图片上填写姓名等信息。
-
数据可视化:数据可视化图表中的标题和标签渲染。
五、注意事项
-
字体路径差异:不同操作系统的字体文件路径不同,Windows通常在C:\Windows\Fonts\目录。
-
默认字体限制:load_default()加载的位图字体大小固定,无法调整,只适合简单场景。
-
中文支持:中文字体需要使用支持中文的字体文件(如simhei.ttf、msyh.ttf)。
-
边界框负值:getbbox()返回的边界框可能包含负值(如字母的上升部和下降部)。
小贴士
Windows系统中常用字体路径示例:C:\Windows\Fonts\msyh.ttc(微软雅黑)、C:\Windows\Fonts\simhei.ttf(黑体)。加载.ttc字体集合时,可能需要通过index参数指定具体字体索引。
六、字体加载方式对比
七、小结与练习
通过本文的学习,我们掌握了Pillow中ImageFont字体的核心方法:
-
ImageFont.truetype()是加载字体的主要方式,支持自定义字体文件和大小。
-
使用getbbox()获取文字尺寸,实现精确的文字定位和居中。
-
处理中文时需确保使用支持中文的字体文件。
练习题
练习1:编写程序,在一张图片上绘制5行文字,每行使用不同的字体大小(16, 24, 32, 48, 64)。
练习2:编写程序,实现一个文字水印函数,接收图片路径和文字内容,在图片右下角绘制半透明文字水印。
常见问题
如何找到Windows系统的字体文件路径?
Windows字体默认存放在C:\Windows\Fonts\目录下。可以在文件资源管理器中打开该目录,查看可用字体文件名。也可以使用Python的os.listdir("C:/Windows/Fonts")列出所有字体文件。
getbbox()和getlength()有什么区别?
getbbox()返回文字的边界框(left, top, right, bottom),包含上下偏移信息,适合精确定位;getlength()返回文字的水平长度,是float值,适合快速计算文字宽度。对于居中计算,getbbox更准确。
如何实现文字换行?
ImageDraw.text()不支持自动换行。需要手动分割文本:使用getlength()或getbbox()测量每行宽度,在合适位置插入换行符,然后循环调用text()逐行绘制,每次增加y坐标偏移量。
如何绘制半透明文字水印?
需要创建一个RGBA模式的透明图层,在图层上绘制文字(使用RGBA颜色如(255,255,255,128)表示半透明白色),然后使用img.alpha_composite(overlay)将图层叠加到原图上。
truetype加载字体时OSError: cannot open resource怎么解决?
这个错误表示找不到字体文件。请检查:1) 字体文件路径是否正确(使用绝对路径更可靠);2) 字体文件是否存在;3) 文件名拼写是否正确。建议将字体文件放在项目目录下,使用相对路径加载,如ImageFont.truetype("./fonts/msyh.ttf", 24)。
本文涉及AI创作
内容由AI创作,请仔细甄别