如何使用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")