You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:30:33