Ara*_*kna 138 python image image-processing python-imaging-library
我有一个透明的png图像"foo.png",我打开了另一个图像
im = Image.open("foo2.png");
Run Code Online (Sandbox Code Playgroud)
现在我需要的是将foo.png与foo2.png合并.
(foo.png包含一些文本,我想在foo2.png上打印该文本)
nos*_*klo 254
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Run Code Online (Sandbox Code Playgroud)
第一个参数.paste()是要粘贴的图像.第二个是坐标,秘密酱是第三个参数.它表示将用于粘贴图像的蒙版.如果传递具有透明度的图像,则Alpha通道将用作遮罩.
检查文档.
olt*_*olt 61
Image.paste当背景图像还包含透明度时,无法按预期工作.您需要使用真正的Alpha Compositing.
Pillow 2.0包含一个alpha_composite执行此操作的功能.
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
Run Code Online (Sandbox Code Playgroud)
编辑:两个图像都必须是RGBA类型.因此,convert('RGBA')如果它们是调色板等,则需要调用.如果背景没有alpha通道,则可以使用常规粘贴方法(应该更快).
P.M*_*lch 41
正如olt已经指出的那样,Image.paste当源和目标都包含alpha 时,它无法正常工作.
请考虑以下情形:
两个测试图像,都包含alpha:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Run Code Online (Sandbox Code Playgroud)
Image.paste像这样合成图像:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
Run Code Online (Sandbox Code Playgroud)
产生下面的图像(重叠的红色像素的alpha部分完全取自第二层.像素未正确混合):
Image.alpha_composite像这样合成图像:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
Run Code Online (Sandbox Code Playgroud)
生成以下(正确)图像:
nvd*_*nvd 10
也可以使用混合:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Run Code Online (Sandbox Code Playgroud)