Python - 图像层数组 - 枕头库

Python - array of image layers - Pillow library

我正在使用 Python 和 Pillow 库研究再生艺术。我有多个包含图像的目录,我的目标是使用 Pillow 库创建 'collages'.

我正在像这样将图像加载到数组中:

#load img files into an array
skin  = [file for file in os.listdir('skin') if file.endswith('.png')]
hair  = [file for file in os.listdir('hair') if file.endswith('.png')]
head  = [file for file in os.listdir('head') if file.endswith('.png')]
mouth = [file for file in os.listdir('mouth') if file.endswith('.png')]
nose  = [file for file in os.listdir('nose') if file.endswith('.png')]
eyes  = [file for file in os.listdir('eyes') if file.endswith('.png')]

#select a random image from each array
skin_img       = random.choices(skin)[0]
hair_img       = random.choices(hair)[0]
head_img       = random.choices(head)[0]
mouth_img      = random.choices(mouth)[0]
nose_img       = random.choices(nose)[0]
eyes_img       = random.choices(eyes)[0]

我想 layer/merge 按特定顺序排列这些,我希望我可以使用数组来完成此操作,如下所示:

order = ['head','skin','mouth','eyes','nose','hair']

使用 Pillow 库,可以合并。两张这样的图片:

img1  = Image.open(head_img)
img2  = Image.open(skin_img)
comp1 = Image.alpha_composite(img1,img2)

我的问题:如何遍历顺序数组并合并我的所有图像,最终得到一个合成图像?

我想我知道你在做什么。但我不知道这是不是最好的方法。尽管如此,我还是会尽我所能回答这个问题。

注意:这可能不是最有效的方法。

我们的面部零件是:

parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']

现在让我们在字典中获取文件列表:

{
    "head": ["f1", "f2", ...],
    "skin": ["s1", "s2", ...],
    "mouth": ["m1", "m2", ...],
    "eyes": ["e1", "e2", ...],
    "nose": ["n1", "n2", ...],
    "hair": ["h1", "h2", ...]
    
}

我不会改变您的做法,但强烈建议您使用 glob.

获取文件路径
files = {
    part: [file for file in os.listdir(part) if file.endswith('.png')]
    for part in parts
}

现在我们有文件 paths/names 需要处理。

接下来我们获取人脸图像并将其放入final_image。我们将把其他图像与这幅图像结合起来。

final_image = Image.open(random.choice(files["head"]))

我看到你正在获取 random.choices 并且正在获取第一个元素:

random.choices(skin)[0]

但您可以获得 random.choice 个列表。它将 return 一个元素。

现在让我们在字典中循环并获取每个面部部分的随机元素并通过 final_image 将其组合。当然除了“脸”

for key, value in files.items():
    if key != "head":
        part_image = Image.open(random.choice(value))
        final_image = Image.alpha_composite(final_image, part_image)

现在你有你要找的东西了。

最终代码为:

parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']

files = {
    part: [file for file in os.listdir(part) if file.endswith('.png')]
    for part in parts
}

final_image = Image.open(random.choice(files["head"]))

for key, value in files.items():
    if key != "head":
        part_image = Image.open(random.choice(value))
        final_image = Image.alpha_composite(final_image, part_image)