Python中基于TTF手写字体渲染文本并精准检测边界的技术求助
老兄,我太懂这种“看似简单实则踩坑踩了一周”的憋屈了!手写字体的边界检测确实比普通印刷体麻烦不少,很多手写字体的字形上下延伸特别夸张,稍不注意就会算不准边缘。不过别慌,用Pillow(也就是PIL的升级版)就能搞定这个需求,我给你一步步捋清楚:
用Pillow实现TTF手写字体渲染与精准边界检测
1. 先装依赖
首先确保你装了Pillow,用pip就行:
pip install pillow
2. 加载手写TTF字体
用ImageFont.truetype()加载你的TTF文件,注意要写对字体文件的路径(绝对路径或者相对路径都行),还可以指定字体大小:
from PIL import Image, ImageFont, ImageDraw # 加载手写字体,替换成你的TTF文件路径 font_path = "your_handwriting_font.ttf" font_size = 48 font = ImageFont.truetype(font_path, font_size)
3. 精准计算文本边界
Pillow 9.1.0及以上版本提供了getbbox()方法,这个方法能返回包含所有字形的最小矩形的坐标,格式是(left, top, right, bottom),完全符合你要的水平/垂直方向的精确起止位置!
对比老版本的getsize(),getbbox()能准确捕捉到手写字体那些超出基线的笔画(比如手写的撇、捺、点的延伸),不会漏掉边缘。
比如你要检测的字符串是"Hello, Handwriting!",直接调用:
text = "Hello, Handwriting!" # 获取文本边界 bbox = font.getbbox(text) left, top, right, bottom = bbox # 输出边界信息 print(f"左边界: {left}, 上边界: {top}, 右边界: {right}, 下边界: {bottom}") print(f"文本宽度: {right - left}, 文本高度: {bottom - top}")
4. 渲染文本并验证边界
为了直观看到边界是否准确,我们可以把文本渲染到图像上,再把边界框画出来:
# 根据边界计算图像大小,留一点边距方便查看 img_width = right - left + 20 img_height = bottom - top + 20 img = Image.new("RGB", (img_width, img_height), "white") draw = ImageDraw.Draw(img) # 渲染文本(注意要把文本的左上角对齐到边界的位置,加上边距偏移) draw.text((10 - left, 10 - top), text, font=font, fill="black") # 画出边界框(红色) draw.rectangle([10, 10, 10 + (right - left), 10 + (bottom - top)], outline="red", width=1) # 保存或显示图像 img.save("handwriting_text_with_bbox.png") img.show()
一些踩坑提示
- 如果你用的是旧版本Pillow,建议升级到9.1.0以上,
getbbox()是真的好用 - 手写字体的
top可能是负数,因为有些字形会向上超出基线,这是正常的,计算高度的时候用bottom - top就对了 - 确保字体路径正确,Windows系统路径注意用双反斜杠或者原始字符串,比如
r"C:\fonts\my_font.ttf"
这样一套操作下来,你不仅能渲染任意手写字体的字符串,还能精准拿到文本的边界坐标,完美解决你的需求!
内容的提问来源于stack exchange,提问作者kikones34
相关产品推荐
相关产品推荐

