如何使用PIL合并一个透明的PNG图像与另一个图像

我有一个透明的PNG图像“foo.png”,我已经打开另一个图像

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

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

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

 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") 

编辑:两个图像都需要是RGBAtypes的。 所以你需要调用convert('RGBA')如果调色板等。如果背景没有alpha通道,那么你可以使用常规的粘贴方法(这应该是更快)。

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

考虑以下情况:

两张testing图像都包含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) 

产生下面的图像(被覆盖的红色像素的alpha部分完全从第二层获取,像素没有被正确混合):

在这里输入图像说明

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

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

产生以下(正确)图像:

在这里输入图像说明

也可以使用混合:

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