Как стереть рисунки, сделанные на изображении PIL? - PullRequest
2 голосов
/ 20 июня 2019

Мне нужно динамически рисовать фигуры на объекте PIL Image и изменять их на основе пользовательских данных.Для этого было бы полезно стереть предыдущие рисунки на изображениях PIL.Я работаю в ноутбуках Jupyter, чтобы использовать функцию display().

Я уже нашел своего рода обходной путь, включающий хранение двух копий изображений в памяти (im и im_draw), иизменив im_draw, добавив чертеж, затем отобразив im_draw, а затем присвоив im_draw = im.copy(), но это определенно не элегантное решение.

from PIL import Image, ImageDraw
from skimage import data
from IPython.display import display

im = Image.fromarray(data.astronaut()) # This is an example image but you could use Image.open('eg_image.jpg')
display(im)
# Draw the rectangle on im_draw
draw = ImageDraw.Draw(im)
draw.rectangle((120, 120, 380, 380), width=10, outline='red')
display(im)

# I would like to erase the drawing here, if possible, e.g.
# im.erase_drawing(), such that display(im) showed the original image

#########################

# Temporary workaround; Alternative Approach
im = Image.fromarray(data.astronaut())
im_draw = im.copy()
# Draw the rectangle on im_draw
draw = ImageDraw.Draw(im_draw)
draw.rectangle((120, 120, 380, 380), width=10, outline='green')
display(im_draw)
im_draw = im.copy() # Resets im_draw to im
display(im_draw)

Альтернативный подход работает, но он требует больше памятии в идеале я бы просто смог стереть рисунок из im.Пожалуйста, дайте мне знать, если у вас есть идеи, как это сделать.

...