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

Pillow中Emoji及特殊字符无法渲染的问题求助

Pillow文本渲染特殊字符与Emoji异常的解决方法

问题描述

使用Pillow渲染包含花体Unicode字符和组合Emoji(如😶‍🌫️)的文本时出现显示异常,示例代码如下:

text = str(input())
text_font = ImageFont.truetype(f"{os.getcwd()}{media_content_dir}Inter-Regular.otf", 17)
draw.text((235, 120), text, font=text_font, fill=(182, 182, 182))

测试输入文本:𝓶𝔂 𝓽𝓮𝔁𝓽 normal text 😠😒🤭😶‍🌫️😜😍,异常现象在更换任意字体(包括系统字体)后仍存在。

解决方法

  • 升级Pillow到最新版本
    旧版本Pillow对Unicode字符和复杂Emoji的支持存在缺陷,执行以下命令升级:

    pip install --upgrade pillow
    
  • 添加描边参数优化花体字符显示
    部分花体Unicode字符属于装饰性变体,默认渲染可能出现断缺,添加描边参数可改善显示效果:

    draw.text((235, 120), text, font=text_font, fill=(182, 182, 182), stroke_width=1, stroke_fill=(182, 182, 182))
    
  • 归一化Unicode字符格式
    组合Emoji(如😶‍🌫️)由多个Unicode码点拼接而成,归一化格式可确保Pillow正确识别并渲染:

    import unicodedata
    text = unicodedata.normalize('NFC', text)
    
  • 使用全Unicode支持的字体
    部分字体未覆盖全部Unicode字符集,替换为支持完整字符的字体(如Noto Sans、Segoe UI Emoji、Symbola):

    # 示例:使用Noto Sans字体,需确保字体文件路径正确
    text_font = ImageFont.truetype("NotoSans-Regular.ttf", 17)
    
  • 提前计算文本边界
    复杂字符可能导致文本边界计算偏差,提前获取边界可避免字符被截断或错位:

    bbox = draw.textbbox((235, 120), text, font=text_font)
    # 根据bbox结果调整画布大小或渲染坐标
    draw.text((235, 120), text, font=text_font, fill=(182, 182, 182))
    

内容的提问来源于stack exchange,提问作者mooncdx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:03:21