我有多张带有白色背景的PNG图像,并且图像的某些部分填充有图案(可能是不同的颜色,例如黑色,蓝色,红色,黄色等)。
如何使用Python PIL库将所有这些图像合并为一个图像,以使所有非白色部分都出现在单个图像上?
例如,
我有以下3张PNG图片:
现在,我想将所有这些图像合并为一张图像,以使背景仍然是白色,但是所有图案都出现在一张图像上。
作为示例,我选择了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()
但是它合并图像的方式使得只有其中一个图像的内容可见。
我需要对大量图像进行此操作,其中每个图像仅占最终图像的一小部分。
答案 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.png
,b.png
和c.png
,则可以在终端中运行:
convert a.png \
\( b.png -transparent white \) -composite \
\( c.png -transparent white \) -composite result.png
这表示... “将图像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