python3使用draw.text画图,解决python3中的truetype乱码

背景:我们在做UI自动化截图的时候,为了方便,截图中记录一些文本内容

一、处理用到的类:

Image+ImageDraw+ImageFont

二、对应的方法:

1、打开图片Image.open()

2、找到画笔ImageDraw.Draw(image)

3、加载并创建字体对象ImageFont.truetype(),乱码就在这一步。路径和对应的编码格式

4、文本画入到图片draw.text

5、保存图片对象image.save()

image_path="picture/web.png"    
image = Image.open(image_path)
draw = ImageDraw.Draw(image)
font_path = os.path.join("assets", "FiraMono-Regular.ttf")
font = ImageFont.truetype(font_path, 30)
# 显示图片
draw.text((400, 1100), text, font=font, fill=color, stroke_width=5, stroke_fill=(249, 205, 173))
# 保存
image.save(image_path)

三、遇到的问题,打印出来的中文乱码:

一开始以为是text(文本内容)编码导致的,然后用encode编码,decode解码都不行。最后发现是解析的文件不太对

四、解决python3中的truetype乱码:

1、乱码主要是在加载创建字体对象的时候truetype对象影响到的

2、解决:在其中的font路径改为Hiragino Sans GB.ttc的形式

image_path="picture/web.png"
# 打开图片
image = Image.open(image_path)
# 找到画笔,将图片对象放入
draw = ImageDraw.Draw(image)
# 用Hiragino Sans GB.ttc的形式
font_path = os.path.join("assets", "Hiragino Sans GB.ttc")
# 加载并创建一个字体对象,给定字体的大小、编码
font = ImageFont.truetype(font_path, size=30, encoding="gbk")
# 显示图片,坐标(100, 100)处开始,画出color颜色文本.stroke_width=5是模糊度,stroke_fill是背景颜色
draw.text((400, 1100), text, font=font, fill=color, stroke_width=5, stroke_fill=(249, 205, 173))
# 保存
image.save(image_path)

3、如果还是编码有问题需要改truetype方法中的encoding,这个是写入图片文本编码格式,与text方法中的text编码形式一样。

----如果不一样,encoding="unic",text进行编码尝试

附录:truetype源码

代码提交记录


版权声明:本文为tchtest原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。