如何用Python Pillow将多码位Emoji生成为单字符形式图片?
解决Pillow生成ZWJ组合Emoji时拆分显示的问题
你使用Pillow结合Noto Emoji字体生成Emoji图片时,单码位Emoji(如🙂)显示正常,但像👩👩👧👦这类由零宽连接符(ZWJ)组合的多码位Emoji会被拆成多个独立字符,无法渲染成整合的单Emoji样式。
解决方案
Pillow的ImageDraw.text()方法默认未启用字体的**字符组合(ccmp)**OpenType特性,而Noto Emoji字体需要该特性来渲染ZWJ组合的Emoji。只需在调用draw.text()时添加features=["ccmp"]参数即可。
修改后的测试代码
from PIL import Image, ImageDraw, ImageFont # 多码位组合Emoji emoji = "👩👩👧👦" image = Image.new("RGB", (600, 100), "#eeeeee") draw = ImageDraw.Draw(image) font = ImageFont.truetype("NotoEmoji-Bold.ttf", size=80) # 添加features参数启用字符组合特性 draw.text((0, 0), emoji, font=font, fill="#000000", features=["ccmp"]) image.save("family_emoji.png")
关键说明
- 👩👩👧👦这类Emoji本质是
👩 + ZWJ + 👩 + ZWJ + 👧 + ZWJ + 👦的组合,ZWJ(U+200D)是零宽连接符,用于告诉字体将多个字符渲染为单个整合字形。 - Noto Emoji字体内置了这类组合的字形定义,但需要通过
ccmp(Character Composition/Decomposition)特性触发渲染逻辑。 - 确保你的Pillow版本≥9.0.0(该版本开始支持
features参数),同时使用最新版的Noto Emoji字体,避免因版本缺失导致部分组合Emoji不支持。
内容的提问来源于stack exchange,提问作者Phil Gyford
相关产品推荐
相关产品推荐

