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() 参数

参数 类型 必填 说明
font str/Path 字体文件路径,None则使用默认字体
size int 字体大小(像素),默认10
index int 字体集合中的索引,默认0
encoding str 字体编码,默认空字符串

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参数指定具体字体索引。

六、字体加载方式对比

方法 字体类型 可调大小 中文支持 说明
load_default() 位图字体 内置默认字体
truetype(font, size) TrueType/OpenType 取决于字体 最常用方式
load(path) 位图字体 加载自定义位图字体

七、小结与练习

通过本文的学习,我们掌握了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)

标签: Pillow ImageFont 字体加载 truetype 文字处理 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pillow ImageDraw绘图教程 - 绘制形状文字与图像标注详解 下一篇: Pillow ImageEnhance图像增强详解 - 亮度对比度饱和度锐度调整教程

poll相关推荐