繁体   English   中英

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

[英]Python PIL - Merge Multiple Layers of Images into One

我有多张带有白色背景的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()

但是它以这样的方式合并图像:仅其中一个图像的内容可见。

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

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

您可以使用安装在大多数Linux发行版中且可用于macOS和Windows的ImageMagick轻松地完成此操作。 因此,假设您的图像称为a.pngb.pngc.png ,则可以在终端中运行:

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

在此处输入图片说明

那就是说... “将图像a.png作为具有白色背景的基本图像,加载b.png并使所有白色像素透明并合成第一幅图像的顶部。然后对c.png进行相同c.png并将输出保存为result.png

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM