使用PIL粘贴的图像会产生伪影。

3

我有一堆图片需要加上文字覆盖。我用GIMP创建了覆盖层(PNG格式,带透明度),然后尝试将其粘贴到另一张图片的顶部:

from PIL import Image

background = Image.open("hahn_echo_1.png")
foreground = Image.open("overlay_step_3.png")

background.paste(foreground, (0, 0), foreground)
background.save("abc.png")

然而,我得到的不是漂亮的黑色文本,而是这个:

Broken Image

在Gimp中,overlay.png看起来像这样:

Overlay Gimp

所以我希望看到一些漂亮的黑色文本,而不是这个五颜六色的混乱。

有什么想法吗?我错过了一些 PIL 选项吗?


你尝试过使用 alpha_composite 吗?请参考这个答案 - vrs
该死,谢谢。我是从这个答案来的,但没有往下滚动…… - user3696412
1个回答

5
如上所述,正如vrs在上面指出的那样,使用alpha_composite像这个回答一样:如何使用PIL将透明PNG图像与另一个图像合并

可以达到目的。确保将图像设置为正确的模式(RGBA)。

完整解决方案:

from PIL import Image

background = Image.open("hahn_echo_1.png").convert("RGBA")
foreground = Image.open("overlay_step_3.png").convert("RGBA")
print(background.mode)
print(foreground.mode)

Image.alpha_composite(background, foreground).save("abc.png")

结果:

结果


该图片显示了一个结果。

2
看起来像是一个调色板的问题 - GIMP 无法处理带有部分透明度的索引 PNG 图像 - 所以,我想说 OP 的背景图像是一个 indexed.png,并且当使用 .paste 进行粘贴时,PIL 在错误的方式下强制将叠加层转换为索引。我建议对 OP 的背景简单地应用 .convert 步骤应该可以解决问题。 - jsbueno

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