如何使用PIL将透明png图像与另一个图像合并
image
image-processing
python
python-imaging-library
5
0

我有一个透明的png图像“ foo.png”,并且用

im = Image.open("foo2.png");

现在我需要将foo.png与foo2.png合并。

(foo.png包含一些文本,我想在foo2.png上打印该文本)

参考资料:
Stack Overflow
收藏
评论
共 4 个回答
高赞 时间 活跃
import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()

.paste()第一个参数是要粘贴的图像。第二个是坐标,秘密调味料是第三个参数。它表示将用于粘贴图像的遮罩 。如果通过透明图像,则Alpha通道将用作遮罩。

检查文档

收藏
评论

当背景图像还包含透明度时, Image.paste无法正常工作。您需要使用真正的Alpha合成

枕头2.0包含执行此操作的alpha_composite函数。

background = Image.open("test1.png")
foreground = Image.open("test2.png")

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

编辑:两个图像都必须是RGBA类型。因此,如果使用调色板等,则需要调用convert('RGBA') 。如果背景没有Alpha通道,则可以使用常规的粘贴方法(应该更快)。

收藏
评论

也可以使用混合:

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
收藏
评论

正如olt已经指出的那样,当源目标都包含alpha时, Image.paste无法正常工作。

请考虑以下情形:

两个测试图像都包含alpha:

在此处输入图片说明 在此处输入图片说明

layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")

像这样使用Image.paste合成图像:

final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)

产生以下图像(红色像素的叠加部分完全取自第二层。像素未正确混合):

在此处输入图片说明

使用Image.alpha_composite合成图像, Image.alpha_composite所示:

final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)

产生以下(正确)图像:

在此处输入图片说明

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号