Когда я хочу удалить часть черного слоя, я обычно рисую прозрачную фигуру, и когда я восстанавливаю черный слой, я просто рисую полностью черную фигуру.
Вот моя текущая реализация:
Код: Выделить всё
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