PIL:在图像顶部绘制透明文本

14
在我的一个项目中,我试图在一些文本上创建一个轮廓。总体思路是将黑色文本略微透明地偏移出原始白色文本。
由于某些原因,我得到了黑色文本,但并没有透明度。以下是MCVE:
image = Image.open("spongebob.gif").convert("RGBA")

draw = ImageDraw.Draw(image, "RGBA")
font = ImageFont.truetype("impact.ttf", 25)
draw.text((0, 0), "This text should be 5% alpha", fill=(0, 0, 0, 15), font=font)
image.save("foo.gif")

结果:

Sponge Bob not happy

我错过了什么?

1个回答

18

这应该适用于您。

from PIL import Image, ImageDraw, ImageFont

image = Image.open("spongebob.gif").convert("RGBA")
txt = Image.new('RGBA', image.size, (255,255,255,0))

font = ImageFont.truetype("impact.ttf", 25)
d = ImageDraw.Draw(txt)    

d.text((0, 0), "This text should be 5% alpha", fill=(0, 0, 0, 15), font=font)
combined = Image.alpha_composite(image, txt)    

combined.save("foo.gif")

编辑:Pillow文档中的参考示例https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html#example-draw-partial-opacity-text


1
这是我解决问题的一种方式。你有任何想法为什么它会像这样工作吗?为什么直接在图像上绘制文本不起作用? - FunkySayu
@FunkySayu 我不知道为什么它会这样工作,从未深入研究过。我一直把它当作典型图像编辑器(例如Paint.NET)中的图层来处理,如果您想调整某个元素的不透明度,则将其放在自己的图层上,然后合并到最终产品中。为什么它不像matplotlib中的“alpha”那样运行,我也不清楚。 - Alex Jadczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接