PIL:将图像粘贴到透明图像上而不破坏背景像素

问题描述 投票:0回答:2

我尝试使用 PIL 将两个图像组合在一起,中间有一个心形图像,但它总是删除其后面的像素并用完全透明的替换它们,从而破坏了其下面的图像。如何在不执行此操作的情况下将图像粘贴/覆盖到图像上的特定位置?

当前代码:

heart = Image.open("Heart.png")
shrimp = Image.open("Shrimp_Jackson.jpg")
bg = Image.open("bg.png").resize((400,250))

bg.paste(shrimp, (0,0))
bg.paste(shrimp, (200,0))
bg.paste(heart, (60, 0))
bg.save("Output.png")

结果: This happens

python image python-imaging-library
2个回答
0
投票

你的心可能没有透明背景,它只有白色背景。

下载ImageMagick,然后使用magick命令将白色非透明背景转换为透明背景:

magick convert heart.png -transparent white heart2.png

然后按照@HansHirse的建议在代码中使用这个

heart2.png
bg.paste(heart, (60, 0), mask=heart)


0
投票

如果您确定您的图像是完全透明的,尽管如此,它不起作用,这就是解决方案。

确保您的两个图像都处于 RGBA 模式以支持透明度,并且可以通过以下代码实现:

heart = heart.convert("RGBA")
bg = bg.convert("RGBA")

现在使用你的心脏作为源图像和蒙版

bg.past(im=heart, box=(0,0), mask=heart)

当我们使用相同的图像作为蒙版时,粘贴方法会根据每个像素的透明度值来识别何时粘贴像素以及删除哪些像素。具有较高 Alpha 值(较不透明或较不透明)的像素将完全粘贴,而具有较低 Alpha 值(较透明)的像素将允许输出图像显示出来。

© www.soinside.com 2019 - 2024. All rights reserved.