使用PIL库绘制勾选标记失败,请求排查问题原因
问题排查与解决
你的代码主要有三个问题导致勾选标记无法正常显示:
1. Wingdings字体的字符映射错误
Wingdings这类符号字体的字符逻辑和标准Unicode不同,你用的\u2713是通用Unicode勾选标记,但Wingdings里的勾选标记对应的是ASCII字符'P'(大写P),而非Unicode码。硬塞Unicode码进去,Wingdings找不到对应符号,只会显示空白或乱码。
2. 重复覆盖勾选标记变量
你连续两次给unicode_text赋值,最后只有\u2713生效,之前定义的粗体勾选\u2714被完全覆盖,等于白定义了。
3. 字体文件名拼写错误(大概率)
系统里的Wingdings字体文件名是Wingdings.ttf(末尾带s),你写的Wingding.ttf会导致PIL找不到字体文件,自动 fallback 到默认字体,自然显示不出正确符号。另外如果你的系统Arial字体路径不对,也会出现类似问题。
修正后的代码
from PIL import Image, ImageDraw, ImageFont font_color = (0, 0, 0) # 分别定义不同类型的勾选标记 heavy_tick = u"\u2714" # 粗体Unicode勾选 regular_tick = u"\u2713" # 常规Unicode勾选 wingdings_tick = "P" # Wingdings对应的勾选字符(大写P) # 打开目标图片(替换为你的实际路径) im = Image.open("img_path").convert('RGB') draw = ImageDraw.Draw(im) # 注意字体文件名的正确拼写,若找不到字体可直接写绝对路径 # 例:Windows系统下可写 "C:/Windows/Fonts/wingdings.ttf" font_wingdings = ImageFont.truetype("Wingdings.ttf", 40) font_arial = ImageFont.truetype('arial.ttf', 40) # 用对应字体绘制匹配的标记 draw.text((10, 10), wingdings_tick, font=font_wingdings, fill=font_color) draw.text((20, 40), regular_tick, font=font_arial, fill=font_color) draw.text((30, 80), heavy_tick, font=font_arial, fill=font_color) im.save("text.jpg")
额外注意事项
- 若还是加载失败,直接使用字体文件的绝对路径,比如Windows字体默认在
C:/Windows/Fonts/,Linux在/usr/share/fonts/,macOS在/Library/Fonts/。 - Arial原生支持
\u2713和\u2714这类Unicode勾选标记,只要能正确加载Arial就能显示。 - 测试时可以捕获
IOError,确认字体文件是否加载成功。
内容的提问来源于stack exchange,提问作者R.K
相关产品推荐
相关产品推荐

