Сопоставляя изображение со случайными координатами, используя PIL, без них оставайтесь один над другим - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь поместить 3 изображения в фоновое изображение со случайными координатами, используя библиотеку изображений Python (PIL).Я приложил все необходимые изображения чуть ниже кода.

#background = 800x400
#red,blue,green = 120x48

background = Image.open('background.png')
red = Image.open('red.png')
blue = Image.open('blue.png')
green = Image.open('green.png')

positionxred = random.randint(0, 800)
positionyred = random.randint(0, 400)

positionxblue = random.randint(0, 800)
positionyblue = random.randint(0, 400)

positionxgreen = random.randint(0, 800)
positionygreen = random.randint(0, 400)

background.paste(red, (positionxred, positionyred), red)
background.paste(blue, (positionxblue, positionyblue), blue)
background.paste(green, (positionxgreen, positionygreen), green)

background.save("test.png")

Вложения:

фон

background

красный

red

синий

blue

зеленый

green

тест

testМоя цель состоит в том, чтобы координаты области красного, синего и зеленого изображений не были одинаковыми, потому что в этом случае изображения будут оставаться друг над другом, как показано на прилагаемом тестовом изображении.Как видите, размеры изображений красного, синего и зеленого составляют 120х48, то есть 5760 единиц площади.Фоновое изображение имеет размер 400x800, а общая площадь составляет 320000 единиц.Мне нужно, чтобы 5760 единиц площади каждого изображения не оставались поверх другого изображения, используя какую-либо команду зацикливания, как мне поступить?

1 Ответ

0 голосов
/ 02 февраля 2019

Основная часть - повторно вставьте точки, когда все изображения не перекрываются:

from PIL import Image
import random

"""
[ref](https://www.geeksforgeeks.org/find-two-rectangles-overlap/)
"""
def is_overlap(l1, r1, l2, r2):
    if l1[0] > r2[0] or l2[0] > r1[0]:
        return False

    if l1[1] > r2[1] or l2[1] > r1[1]:
        return False

    return True

background = Image.open('background.png')
paste_image_list = [Image.open('red.png'), Image.open('blue.png'), Image.open('green.png')]
alread_paste_point_list = []

for img in paste_image_list:
    # if all not overlap, find the none-overlap start point
    while True:
        # left-top point
        # x, y = random.randint(0, background.size[0]), random.randint(0, background.size[1])

        # if image need in the bg area, use this
        x, y = random.randint(0, max(0, background.size[0]-img.size[0])), random.randint(0, max(0, background.size[1]-img.size[1]))

        # right-bottom point
        l2, r2 = (x, y), (x+img.size[0], y+img.size[1])

        if all(not is_overlap(l1, r1, l2, r2) for l1, r1 in alread_paste_point_list):
            # save alreay pasted points for checking overlap
            alread_paste_point_list.append((l2, r2))
            background.paste(img, (x, y), img)
            break

background.save("test.png")

# check like this, all three rectangles all not overlapping each other
from itertools import combinations
assert(all(not is_overlap(l1, r1, l2, r2) for (l1, r1), (l2, r2) in combinations(alread_paste_point_list, 2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...