问题:如何使用PIL将透明png图像与另一个图像合并
我有一个透明的png图像“ foo.png”,并且用
im = Image.open("foo2.png");
现在我需要将foo.png与foo2.png合并。
(foo.png包含一些文本,我想在foo2.png上打印该文本)
回答 0
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
的第一个参数.paste()
是要粘贴的图像。第二个是坐标,秘密调味料是第三个参数。它表示将用于粘贴图像的遮罩。如果通过透明图像,则Alpha通道将用作遮罩。
检查文档。
回答 1
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通道,则可以使用常规的粘贴方法(应该更快)。
回答 2
正如olt已经指出的那样,Image.paste
当源和目标都包含alpha 时,将无法正常工作。
请考虑以下情形:
两个测试图像都包含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
像这样合成图像:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
产生以下(正确)图像:
回答 3
也可以使用混合:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
回答 4
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
回答 5
有类似的问题,很难找到答案。通过以下功能,您可以将具有透明度参数的图像以特定的偏移量粘贴到另一幅图像上。
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
回答 6
我结束了自己的编码的建议此评论用户@ P.Melch一个项目我正在做,并建议通过@Mithril。
我也编码了安全性,这是它的代码。(我链接了一个特定的提交,因为在此存储库的将来情况可能会发生变化)
注意:我希望图像中有numpy数组,例如np.array(Image.open(...))
,输入A和B copy_from
以及此链接的函数overlay
参数。
依赖项是位于其之前的函数,copy_from
方法和numpy数组,它们是要切片的PIL图像内容。
尽管该文件是非常面向类的,但是如果要使用该函数overlay_transparent
,请确保将重命名self.frame
为背景图像numpy数组。
或者,您可以仅复制整个文件(可能删除一些导入和Utils
类),然后与此Frame类进行交互,如下所示:
# Assuming you named the file frame.py in the same directory
from frame import Frame
background = Frame()
overlay = Frame()
background.load_from_path("your path here")
overlay.load_from_path("your path here")
background.overlay_transparent(overlay.frame, x=300, y=200)
然后,您将其background.frame
作为叠加和alpha合成数组,可以使用overlayed = Image.fromarray(background.frame)
或类似的东西从中获取PIL图像:
overlayed = Frame()
overlayed.load_from_array(background.frame)
或者就像background.save("save path")
直接取自alpha复合内部self.frame
变量一样。
您可以读取该文件,并找到其它的一些功能,这个实现我喜欢的编码方法get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)
您可能想要删除该resolve_pending
项目专用的方法。
很高兴能为您提供帮助,请务必查看我正在谈论的项目的回购协议,该问题和线程对我的发展大有帮助:)