发现问题:
在“借鉴”别人的项目的时候,使用pillow库会出现以下问题
drawSize = draw.textsize(writeText, font)
AttributeError: 'ImageDraw' object has no attribute 'textsize
offset = font.getoffset(writeText)[0]
AttributeError: 'FreeTypeFont' object has no attribute 'getoffset'
之后我也查询了百度,大致问了下AI,也没有得到满意的结果,百度一搜千篇一律让降级,诶,那就试试降级吧。
问题分析
不想改变主环境?那好办,建立一个虚拟环境,然后通过pip安装旧版本的PIL,测试大概在9.3.0左右的版本还支持这样的语法。
virtualenv piltest
pip install pillow==9.3.0
然后呢?降级了之后让我们复制原来的代码来跑一下
drawSize = draw.textsize(writeText, font)
offset = font.getoffset(writeText)[0]
print(f"绘画大小:{drawSize},文字偏移量:{offset}")
然后看到了以下的输出
大致的意思就是,在ImageDraw中的textsize方法,和在ImageFont中的getoffset方法会被在新版本中废除,所以这就是为什么我们之前跑的时候会报那两个问题
解决方法:
那显而易见,解决方法无非就两种:
- 按照百度上的其他教程,降级你的pillow库至9.3.0或以下的版本
pip install pillow==9.3.0
- 把你的程序代码修改为类似以下形式
writeText = "这是写入的句子"
image = Image.new('RGB', (300, 200), (255, 255, 255))
font = ImageFont.truetype("simhei.ttf", 20)
draw = ImageDraw.Draw(image)
if __name__ == "__main__":
drawSize = draw.textbbox((0,0),writeText, font)
offset = font.getbbox(writeText)[
print(drawSize)
print(offset)
关于 draw.textbbox( ) 中不按照上述提示,而多传入一个xy参数的原因:
实际运行测试中,发现只传两个参数会出现参数缺失的异常,而缺失的正是第一位参数xy
所以第一位要传入一个元组(x,y),后续参数与原来的方法一致
输出结果如下,与旧版本使用的方法输出一致:
> (0,0,140,21) # 后两位为大小
> (0,0,140,21) # 偏移量为前两位
总结:
虽然确实不是什么很大的问题,但不降级确实也看不出来,百度一大堆都是劝降版本,但是降版本有些依赖又会出问题,所以还是从程序代码上更新比较好,部分专业术语我可能不是很熟悉,文中可能有误,请大佬多多指教。