Python — PIL перезаписывает исходное изображение?

Есть код на Python который из текстуры с модельками кораблей вырезает по отдельности каждый корабль и вставляет их на черный фон.
from PIL import Image
bg = Image.open('Background.png')
ships = Image.open('Ships.png')

x = 127
y = 75
x_ship = 0
y_ship = 0

for i in range(3):
    for j in range(3):
        x_ship = 0
        for k in range(20):
            ship = ships.crop((x_ship, y_ship, x_ship+x, y_ship+y))
            out_image = bg
            out_image.paste(ship, None, ship)
            out_image.save('ships/I'+str(i)+'J'+str(j)+'K'+str(k)+'_ico.png', 'PNG')
            x_ship += x
        y_ship += y

bg.show()

Проблема в том что каким-то образом в переменную bg заноситься ссылка на объект конечного изображения.
Получается что каждое последующие изображение накладывается на предыдущие.
Поясните такое поведение.

Первое полученное изображение:
h_1399815677_3455271_e525c927d6.png
Вот шестое:
h_1399815736_8569636_8576e4ad94.png
А вот 180 (bg.show() выдает именно такую картинку):
h_1399815789_9931499_d9a440a839.png

Пока проблему решил заменой bg на bg.crop()
out_image = bg
out_image = bg.crop()
  • Вопрос задан
  • 4561 просмотр
Решения вопроса 2
@zedxxx
Поздравляю, вы только что познакомились с таким понятием как ссылка.

Канонический пример:
Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [10, 15]
>>> b = a
>>> b[0] = 25
>>> b
[25, 15]
>>> a
[25, 15]
>>>


Поэтому, если надо именно скопировать сложный объект, то нужно пользоваться соответствующими свойствами, а не простым присвоением.
Ответ написан
DOOMer
@DOOMer
Вместо

out_image = bg


Используйте метод copy() у объекта Image

pillow.readthedocs.org/en/latest/reference/Image.h...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы