Python PIL如何在全黑方块中粘贴图像

时间:2019-04-30 19:06:36

标签: python image python-imaging-library

目标是将透明PNG文件粘贴到1000 x 1000的基本图像上。到目前为止,我的代码将250 x 250的图像粘贴到基本图像上,但随机放置在整个基本图像中。结果看起来像这样enter image description here

这是代码的一部分,所以你们可以看到发生了什么。

import random
from PIL import Image, ImageDraw, ImageOps, ImageFont 

###This creates the base image ###
base = Image.new('RGB',(1000,1000),'black')
base.save('base_image.jpg')

### Opens up all the images that will be used###
jon = Image.open('jon_snow.jpg')
rejon = Image.open('resized_jon.jpg')
wolf = Image.open('wolf.png')


### The List of locations around the base image ###
location = [(0,0),(0,250),(0,500),(0,750),(250,0),(250,250),(250,500),(250,750),(500,0),(500,250),(500,500),(500,750),(750,0),(750,250),(750,500),(750,750),(0,0),(0,250),(0,500),(0,750),(250,0),(250,250),(250,500),(250,750),(500,0),(500,250),(500,500),(500,750),(750,0),(750,250),(750,500),(750,750)]
### Opertaions used ###
def image_resize(image,size):
  image.resize((size))
  image.save('resized_jon.jpg')
  return


def image_invert(image):
  inverted = ImageOps.invert(image)
  base.paste(inverted,random.choice(location))
  base.save('base_image.jpg')
  return

def fill_base():
  for x in range(6):
    image_invert(rejon)

我没有添加所有操作只是为了节省时间。因此,您可以看到,使用随机数时,它不会在生成时始终填充所有黑色方块。所以这就是我想创建一个for循环或检查那些正方形何时为黑色的东西,然后我可以在该位置粘贴一个PNG文件。是否可以检查那些黑色方块?任何帮助

2 个答案:

答案 0 :(得分:2)

您可以跟踪return的结果,以便例如通过使用图块粘贴功能的返回值来知道哪些正方形留为空白(/ black):

location

(注意:如果您的函数没有返回值,则不需要import random from PIL import Image ###This creates the base image ### base = Image.new('RGB',(1000,1000),'black') location = [(250*a, 250*b) for a in range(4) for b in range(4)] jon = Image.new('RGB', (250, 250), 'red') print('locations used:') for i in range(10): r = random.choice(location) location.pop(location.index(r)) base.paste(jon, r) print(r) base.save('base_image.jpg') print('\nlocations left black:') print(location) 语句)


每个粘贴的图块缩小# locations used: # (500, 250) # (0, 750) # (250, 0) # (750, 500) # (0, 500) # (250, 500) # (750, 0) # (750, 750) # (0, 250) # (500, 500) # locations left black: # [(0, 0), (250, 250), (250, 750), (500, 0), (500, 750), (750, 250)] 的次数:

{{1}}

结果:

{{1}}

答案 1 :(得分:0)

如果您真的想测试一张完全不黑的图像,可以将图像转换为一个numpy数组:

import numpy as np
B = np.array(base)
(B[0:250, 0:250]==0).all()
# True or False

您可以使用此测试来列出具有以下所有黑色图块的列表

blk_loc = [l for l in location if (B[l[1]:l[1]+250, l[0]:l[0]+250]==0).all()]

(请注意,您必须将x和y的顺序交换为numpy的行和列索引。)