Python PIL-将多层图像合并为一个

时间:2019-02-03 03:41:32

标签: python python-imaging-library

我有多张带有白色背景的PNG图像,并且图像的某些部分填充有图案(可能是不同的颜色,例如黑色,蓝色,红色,黄色等)。

如何使用Python PIL库将所有这些图像合并为一个图像,以使所有非白色部分都出现在单个图像上?

例如,

我有以下3张PNG图片:

Image #1 Image #2 Image #3

现在,我想将所有这些图像合并为一张图像,以使背景仍然是白色,但是所有图案都出现在一张图像上。

作为示例,我选择了2张图像并尝试了以下操作:

#! /usr/bin/python

from PIL import Image

background = Image.open("check00001.png")
foreground = Image.open("check00002.png")

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

但是它合并图像的方式使得只有其中一个图像的内容可见。

我需要对大量图像进行此操作,其中每个图像仅占最终图像的一小部分。

2 个答案:

答案 0 :(得分:2)

据我所见,您可以使用Pillow轻松地将图像的白色像素转换为透明像素,并将它们逐层遮盖。

要将白色像素转换为透明,您需要先将图像数据转换为缓冲区,然后从缓冲区重新创建,这是示例代码:

from PIL import Image 
# your loop here
img = Image.open('img.png') 
img = img.convert("RGBA") 
datas = img.getdata() 
newData = [] 
for item in datas: 
    if item[0] == 255 and item[1] == 255 and item[2] == 255: 
        newData.append((255, 255, 255, 0)) 
    else: 
        newData.append(item) 

img.putdata(newData) 
img.save("mod_img1.png", "PNG")

然后像在代码中一样进行常规粘贴。

background = Image.open("mod_img1.png") 
foreground = Image.open("mod_img2.png") 

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

答案 1 :(得分:2)

您可以使用 ImageMagick 非常简单地完成此操作,该软件已安装在大多数Linux发行版中,并且可用于macOS和Windows。因此,假设您的图像分别称为a.pngb.pngc.png,则可以在终端中运行:

convert a.png                                \
   \( b.png -transparent white \) -composite \
   \( c.png -transparent white \) -composite result.png

enter image description here

这表示... “将图像a.png作为具有白色背景的基本图像,加载b.png并使所有白色像素透明并合成第一个图像图片。然后对c.png执行相同操作,并将输出保存为result.png

请注意,我还添加了黑色边框,以便您可以在StackOverflow的白色背景上分辨出图像的范围。


请注意,如果您使用的是 ImageMagick v7或更高版本,则命令将变为:

magick a.png                                 \
   \( b.png -transparent white \) -composite \
   \( c.png -transparent white \) -composite result.png