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
相关产品推荐
相关产品推荐

