PIL.ImageFont用字体文件生成文字图片踩坑记录

生成样本用来训练DB,一开始代码如下

from PIL import Image, ImageFont, ImageDraw


text_img = Image.new('RGBA', (3000, 300))
draw = ImageDraw.Draw(text_img)
font_color = (256, 256, 256)

file = r'C:\Users\think\Desktop\ocr-gen\fonts\STSONG.TTF'
font = ImageFont.truetype(file, size=128)

text = '一二三四五'
w, h = font.getsize(text[0])
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x, y, x + w, y + h)

show出来后发现大部分文字在框的偏下位置,框的上方有空白而不是紧贴着文字。后来发现draw.text在生成文字时左上方有offset,于是代码改动如下

text = '一二三四五'
w, h = font.getsize(text[0])
offset_x, offset_y = font.getoffset(text[0])
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x + offset_x, y + offset_y, x + offset_x + w, y + offset_y + h)

结果show出来又发现框还是没有紧贴文字,再查找资料后发现了参考博客中的下图

如图所示,文字的左上角除了offset之外还有一定的偏移,而且右边和下边也有offset,最终代码如下

text = '一二三四五'
offset_x, offset_y = font.getoffset(text[0])
xmin, ymin, xmax, ymax = font.getmask(text[0]).getbbox()
draw.text((x, y), text[0], font=font, fill=font_color)
text_img.crop(x + offset_x + xmin, y + offset_y + ymin, x + offset_x + xmax, y + offset_y + ymax)

即使是这样,对于不同的字,或者同一个字,四周可能有的边紧贴着,有的边会有1个像素的offset,不过可以忽略不计了

参考

https://zhuanlan.zhihu.com/p/105060993

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

00000cj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值