簡體   English   中英

如何將多個圖像粘貼到一個圖像和 output 多個其他圖像上?

[英]How do I paste multiple images onto one image and output multiple other images?

我正忙着寫一些東西來操縱圖像並將其他圖像粘貼到它上面。

我正在嘗試將狗的背景和帽子更改為各種其他文件和 output 具有隨機生成圖像的多個文件。 輸入圖像來自文件夾( backgroundshats )。 當我們拍照並將它們復制到名為背景的文件夾中時,我希望能夠運行我的 Python 腳本,通過從backgrounds文件夾中隨機選擇一張圖像來更改狗的背景。 我希望能夠對hats文件夾中的圖像執行相同的操作。 隨着時間的推移會添加更多文件夾,但這是另一天的問題。

到目前為止,我可以將項目粘貼到主圖像上。 我的文件夾中有多個 PNG 文件,我得到了三個圖像,但所有三個圖像都是相同的。 我的代碼似乎只加載一個背景和一頂帽子。

請幫助我如何將兩個文件夾中的隨機圖像粘貼到我的狗的主圖像上。 狗保持 static,但背景和帽子會改變。 選項應盡可能多,組合可以允許。 因此,三個具有三個選項的文件夾每個都會有很多組合選項。 我已將限制設置為三個,但每次圖像都應呈現不同的組合。

到目前為止我的代碼:

import glob
from PIL import Image

def main():

    q = 0
    hat_image = glob.glob("hats/*.png")
    for image in hat_image:
        with open(image, 'rb') as file:
            hat = Image.open(file)

    bg_image = glob.glob("backgrounds/*.png")
    for image in bg_image:
        with open(image, 'rb') as file:
            bg = Image.open(file)

    try:
        while q < 3:
            img = Image.open("base.png")
            img.paste(hat, (276, 176), hat)
            # mouth = Image.open("./mouth/mouth1.png")
            img.paste(bg, (226,476), bg)
            img.save("final{}.png".format(q), "PNG")
            q += 1

    except IOError:
        pass

if __name__ == "__main__":
    main()

如果你想要背景和帽子圖像的所有可能組合,你只需要相應地迭代,即使用嵌套for循環:

import glob

from PIL import Image

bg_filenames = glob.glob('backgrounds/*.png')
hat_filenames = glob.glob('hats/*.png')
dog_image = Image.open('dog.png')

for bg_filename in bg_filenames:
    for hat_filename in hat_filenames:
        output_image = Image.open(bg_filename)
        output_image.paste(dog_image)
        output_image.paste(Image.open(hat_filename))
        output_image.save('output/{}_{}.png'.format(
            bg_filename.split('\\')[1].split('.png')[0],
            hat_filename.split('\\')[1].split('.png')[0]
        ))

print(glob.glob('output/*.png'))
# ['output\\alley_baseball.png',
#  'output\\alley_cowboy.png',
#  'output\\alley_fedora.png',
#  'output\\garden_baseball.png',
#  'output\\garden_cowboy.png',
#  'output\\garden_fedora.png',
#  'output\\park_baseball.png',
#  'output\\park_cowboy.png',
#  'output\\park_fedora.png']

如果你真的想要每次執行一個具有隨機選擇的背景和帽子的圖像,只需使用randint w.r.t。 背景和帽子圖像的數量:

import glob

from PIL import Image
from random import randint

bg_filenames = glob.glob('backgrounds/*.png')
hat_filenames = glob.glob('hats/*.png')
dog_image = Image.open('dog.png')

bg_filename = bg_filenames[randint(0, len(bg_filenames)-1)]
hat_filename = hat_filenames[randint(0, len(hat_filenames)-1)]

output_image = Image.open(bg_filename)
output_image.paste(dog_image)
output_image.paste(Image.open(hat_filename))
output_image.save('output/{}_{}.png'.format(
    bg_filename.split('\\')[1].split('.png')[0],
    hat_filename.split('\\')[1].split('.png')[0]
))

print(glob.glob('output/*.png'))
# ['output\\alley_cowboy.png',
#  'output\\garden_baseball.png',
#  'output\\garden_fedora.png']                 After three runs

對於這兩個版本,您都可以輕松添加更多文件夾,例如shoesgloves等。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19042-SP0
Python:        3.9.6
PyCharm:       2021.2
Pillow:        8.3.1
----------------------------------------

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM