python - 如何将多张图片粘贴到一张图片上并输出多张其他图片?
问题描述
我正忙着写一些东西来操作图像并将其他图像粘贴到它上面。
我正在尝试将背景和狗的帽子更改为其他各种,并输出带有随机生成图像的多个文件。输入图像来自文件夹 (backgrounds
和hats
)。当我们拍照并将它们复制到名为 background 的文件夹中时,我希望能够运行我的 Python 脚本,通过从backgrounds
文件夹中选择一个随机图像来更改狗的背景。我希望能够对hats
文件夹中的图像执行相同的操作。随着时间的推移会添加更多文件夹,但这是另一天的问题。
到目前为止,我可以将项目粘贴到主图像上。我在文件夹中有多个 PNG 文件,我得到了三个图像,但所有三个图像都是相同的。我的代码似乎只加载了一个背景和一顶帽子。
请帮助我如何将两个文件夹中的随机图像粘贴到我的狗的主图像上。狗保持静止,但背景和帽子会改变。选项应该与组合允许的一样多。因此,三个具有三个选项的文件夹将有很多组合选项。我已将限制设置为三个,但每次图像应呈现不同的组合。
到目前为止我的代码:
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
背景和帽子图像的数量:
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
对于这两个版本,您都可以轻松添加更多文件夹,例如shoes
orgloves
或其他。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.19042-SP0
Python: 3.9.6
PyCharm: 2021.2
Pillow: 8.3.1
----------------------------------------
推荐阅读
- go - 有没有办法在切片的所有元素上应用函数?
- sql-server - 为什么 IsNull 会导致除以零错误?
- python-3.x - 我需要使用 spacy 从文本中推荐电影
- azure-devops - Azure - 在负载测试请求中使用动态生成的身份验证令牌
- spring-boot - 由于 jsse.alias_no_key_entry 使用带有 GoDaddy 签名证书的 JKS,SpringBoot 无法启动
- ios - 如何从 Siri Intent Extension 中打开我的 SwiftUI 应用程序并使用 NSUseractivity 执行功能?
- mysql-python - 将python查询输出输出到字符串
- java - 我不断收到 com.android.volley.RequestQueue.add 空对象引用错误
- sorting - SSRS 中有没有办法突出显示交互式排序的列
- python - 更改数据框中某行的增量值