Как мне создавать и свободно удалять части черного слоя с помощью Python и TkinterPython

Программы на Python
Anonymous
Как мне создавать и свободно удалять части черного слоя с помощью Python и Tkinter

Сообщение Anonymous »

Используя Python и библиотеку tkinter, я хочу создать программу, которая откроет изображение, затем нарисует поверх него полностью черный слой и, используя щелчок мыши + движение, удалит части этого черного слоя (подумайте об этом как туман войны в настольной игре) или восстанавливаю части черного слоя.
Когда я хочу удалить часть черного слоя, я обычно рисую прозрачную фигуру, и когда я восстанавливаю черный слой, я просто рисую полностью черную фигуру.
Вот моя текущая реализация:

Код: Выделить всё

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk, ImageDraw

class ImageEraserApp:
def __init__(self, root):
self.root = root
self.root.title("Image Eraser App")

# Open image file dialog
self.image_path = filedialog.askopenfilename(
filetypes=[("Image files", "*.jpg *.jpeg *.png *.bmp *.gif")]
)
if not self.image_path:
self.root.quit()

# Load original image and create initial resized image
self.original_image = Image.open(self.image_path)
self.resized_image = self.original_image.copy()
self.tk_image = ImageTk.PhotoImage(self.resized_image)

# Create canvas to display image
self.canvas = tk.Canvas(self.root)
self.canvas.pack(fill=tk.BOTH, expand=True)
self.canvas_image = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_image)

# Initialize black layer for erasing and painting
self.black_layer = Image.new('RGBA', self.original_image.size, (0, 0, 0, 255))
self.layer_draw = ImageDraw.Draw(self.black_layer)
self.tk_black_layer = ImageTk.PhotoImage(self.black_layer)

# Eraser size
self.eraser_size = 20

# Bind mouse events
self.canvas.bind("", self.erase)
self.canvas.bind("", self.paint_black)
self.canvas.bind("", self.adjust_eraser_size)

# Display initial black layer
self.black_layer_id = self.canvas.create_image(0, 0, anchor=tk.NW, image=self.tk_black_layer)

def adjust_eraser_size(self, event):
# Adjust the eraser size based on mouse wheel scroll
if event.delta > 0:
self.eraser_size = min(100, self.eraser_size + 20)
elif event.delta < 0:
self.eraser_size = max(20, self.eraser_size - 20)

def erase(self, event):
# Draw on the black layer to "erase" it
self.layer_draw.ellipse([
(event.x - self.eraser_size, event.y - self.eraser_size),
(event.x + self.eraser_size, event.y + self.eraser_size)
], fill=(0, 0, 0, 0))

# Update the black layer on the canvas
self.tk_black_layer = ImageTk.PhotoImage(self.black_layer)
self.canvas.itemconfig(self.black_layer_id, image=self.tk_black_layer)

def paint_black(self, event):
# Draw on the black layer to "paint" it
self.layer_draw.ellipse([
(event.x - self.eraser_size, event.y - self.eraser_size),
(event.x + self.eraser_size, event.y + self.eraser_size)
], fill=(0, 0, 0, 255))

# Update the black layer on the canvas
self.tk_black_layer = ImageTk.PhotoImage(self.black_layer)
self.canvas.itemconfig(self.black_layer_id, image=self.tk_black_layer)

if __name__ == "__main__":
root = tk.Tk()
app = ImageEraserApp(root)
root.mainloop()

Теперь, когда количество рисуемых мной фигур растет, приложение становится все более и более перестающим отвечать на запросы (если я пытаюсь выполнить некоторые операции по изменению размера/увеличению/уменьшению поверх этого , ситуация становится еще хуже (легче всего это заметить при загрузке очень большого изображения)
Мой вопрос: как я могу это оптимизировать? Является ли способ, которым я пытаюсь это реализовать, правильным способом? решить такую ​​проблему?

Подробнее здесь: https://stackoverflow.com/questions/787 ... nd-tkinter

Вернуться в «Python»