Как «отрисовать» прямоугольник в изображении с помощью PIL - PullRequest
0 голосов
/ 12 февраля 2019

По сути, у меня есть функция, которая рисует маленькую рамку вокруг, где пользователь нажимает на изображение, используя метод ImageDraw.Draw.rectangle в PIL.Это прекрасно работает, но проблема в том, что мне нужна возможность, чтобы, когда пользователь щелкает внутри нового окна, он удалялся.Однако, поскольку рамка становится частью изображения, я не могу этого сделать.

Есть ли способы обойти это?Есть ли библиотека вне PIL, которая облегчила бы это?

Спасибо!

1 Ответ

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

Один из способов сделать это - сохранить нетронутую, без аннотации копию вашего основного фонового изображения и сохранить список аннотаций (это то, что я называю квадратами, которые вы упоминаете), например:

  • квадрат, черный, 10, 10, 20, 20
  • квадрат, красный, 100,110, 200,210
  • круг, зеленый, 50,50, 25
  • прямоугольник, синий, 30,30, 40,300

Затем каждый раз, когда вы перерисовываете экран, делайте копию фонового изображения и просматривайте список аннотаций, каждый из которых рисует.

Когда придет время удалить, просмотрите список и удалите запись с ближайшим центром, а затем заново раскрасьте экран.

Вы можете объединить этот подход с предложением @ Mika72 в комментариях.Таким образом, у вас будет исходное, чистое изображение и отдельное изображение для ваших наложений, которое будет того же размера и будет выглядеть как пустой чисто прозрачный холст.Нарисуйте свои аннотации (квадраты и прямоугольники) на этом слое, когда пользователь щелкает, и каждый раз, когда вы перекрашиваете экран, комбинируйте слой аннотаций с исходным изображением.Теперь вам нужно только перебрать список аннотаций и перерисовать их, когда они будут удалены, поэтому перекраска будет выполняться быстрее.


Другой вариант - "резиновые полосы" нарисовав XOR, смотрите ответ здесь .

...