python - Python PIL - 将多层图像合并为一个
问题描述
我有多个白色背景的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()
但它以这样一种方式合并图像,即只有其中一个图像的内容是可见的。
我需要为一大组图像执行此操作,其中每个图像都有一小部分最终图像。
解决方案
据我所知,您可以使用 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()
推荐阅读
- python - 在字符串中使用 %
- node.js - Firebase Firestore 中的异步等待问题
- excel - 根据另一个单元格中的值不断更新一个单元格的颜色
- c# - 在 FileSystemWatcher 中添加或删除新文件后,如何更改 ListView 中的文本颜色?
- javascript - Javascript memoize 查找数组
- excel - 如何在 Excel 中使用多个条件搜索和选择(第一次出现)特定日期?
- android - NavigationDrawer 中的 Google AdMob 横幅广告
- android - Flutter 项目构建失败并显示错误消息:-
- sql - 如何使用vb.net 2019从访问数据库中关系的另一个列表中查看特定列的所有数据主表
- c# - 如何仅对 .fbx、.obj 文件使用 Resources.Loadall