Мне нужно динамически рисовать фигуры на объекте 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
.Пожалуйста, дайте мне знать, если у вас есть идеи, как это сделать.