如何在图像上放置肤色表情符号(黑色竖起大拇指,白色竖起大拇指)?

How to put skin-toned emojis (black thumbs up, white thumbs up) on images?

我希望输出是这样的(在 GitHub 找到):

.

但目前我是这样的:

表情符号的肤色在我的输出中分离了。我该如何解决?我需要其他图书馆吗?

GitHub代码:https://github.com/python-pillow/Pillow/pull/4955

from PIL import Image, ImageDraw, ImageFont

def test(font, out_name):
    fnt = ImageFont.truetype(font, size=109, layout_engine=ImageFont.LAYOUT_RAQM)
    im = Image.new("RGBA", (600, 600), (100, 100, 100, 100))
    draw = ImageDraw.Draw(im)
    draw.text((0, 32), "a\u263A", fill="#faa2", embedded_color=True, font=fnt)
    draw.text((0, 132), "a\u263A", fill="#faa8", embedded_color=True, font=fnt)
    draw.text((0, 232), "a\u263A", fill="#faa", embedded_color=True, font=fnt)
    draw.text((0, 332), "\U0001F3AC\U0001F44B\U0001F3FB\U0001F44B\U0001F3FF", fill="white", embedded_color=True, font=fnt)
    draw.text((0, 432), "a\u263A", fill="#faa2", font=fnt)
    im.show()
    im.save(f"testemoji_{out_name}.png")

test(r"C:\Users\Nulano\Downloads\NotoColorEmoji.ttf", "cbdt")
test("seguiemj.ttf", "colr")

我的代码:

from PIL import Image, ImageDraw, ImageFont
 
def test(font, out_name):
    fnt = ImageFont.truetype(font, size=109, layout_engine=ImageFont.LAYOUT_BASIC,encoding='utf-16')
    im = Image.new("RGBA", (800, 600), (100, 100, 100, 0))
    draw = ImageDraw.Draw(im)
    draw.text((0, 32), "a\u263A",font=fnt, fill="#faa2", embedded_color=True)
    draw.text((0, 132), "a\u263A",font=fnt, fill="#faa8", embedded_color=True)
    draw.text((0, 232), "a\u263A", fill="#faa",font=fnt, embedded_color=True)
    draw.text((0, 332), "\U0001F3AC\U0001F44B\U0001F3FB\U0001F44B\U0001F3FF",font=fnt, fill="white", embedded_color=True)
    draw.text((0, 432), "a\u263A",font=fnt, fill="#faa2", embedded_color=True)
    im.save(path+"testemoji_{out_name}.png")  
    return im
     
# test(path+"Roboto/NotoColorEmoji.ttf", "cbdt")
test(path+"Roboto/seguiemj.ttf", "colr")

可以看到,原代码使用

fnt = ImageFont.truetype(font, size=109, layout_engine=ImageFont.LAYOUT_RAQM)

而您更改了 layout_engine 参数:

fnt = ImageFont.truetype(font, size=109, layout_engine=ImageFont.LAYOUT_BASIC, encoding='utf-16')

看来你需要 Raqm library to get advanced text layouting needed for applying those Fitzpatrick Emoji modifiers.

现在,您似乎还使用了 Windows 版本的 Pillow,默认情况下不包括 Raqm。通过 运行:

检查
print(PIL.features.check_feature('raqm'))

最初,我得到 False 作为输出。

获得 libraqm 的预构建 Windows 库似乎并不那么容易,请参阅 this Q&A,但按照评论中的提示并在那里回答,您应该能够在一些 Windows 10 环境下获得 Raqm 运行。

遵循这些提示后,上述测试的输出在我的机器上变为 True,并且给定的 原始(!) 代码现在重现了链接图片。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
Pillow:        8.1.0
----------------------------------------