首页 > 解决方案 > Python PIL - 将多层图像合并为一个

问题描述

我有多个白色背景的PNG图像,图像的某些部分充满了图案(可能是不同的颜色,黑色,蓝色,红色,黄色等)。

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

举个例子,

我有以下 3 张 PNG 图像:

图片#1 图片 #2 图片#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()

但它以这样一种方式合并图像,即只有其中一个图像的内容是可见的。

我需要为一大组图像执行此操作,其中每个图像都有一小部分最终图像。

标签: pythonpython-imaging-library

解决方案


据我所知,您可以使用 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()

推荐阅读