Python PIL, как вставить изображение во весь черный квадрат - PullRequest
0 голосов
/ 30 апреля 2019

Цель состоит в том, чтобы вставить прозрачный файл 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 ]

2 голосов
/ 30 апреля 2019

Вы можете отслеживать результаты random.choice, чтобы вы уже знали, какие квадраты оставлены пустыми (/ черными), например, используя возвращаемое значение вашей функции вставки плитки:

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

(Примечание: вам не нужен оператор return, если ваша функция не имеет возвращаемого значения)


Макве сжатия 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)]        
0 голосов
/ 01 мая 2019

Если вы действительно хотите проверить плитку вашего изображения, чтобы он не был полностью черным, вы можете привести изображение к массиву:

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.)

...