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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:55:04