不需要使用cv2 来绘制它。您可以为此使用tkinter 和PIL。
首先,您必须像正常 PIL image 一样加载图像
self.image = Image.open(self.file_path)
self.width, self.height = self.image.size
接下来您必须创建photo 用于在画布上显示,并创建draw 用于绘图并保存。
self.photo = ImageTk.PhotoImage(image=self.image)
self.draw = ImageDraw.Draw(self.image)
您可以使用tkinter 选择显示图像上的位置
self.canvas.bind('<Button-1>', self.draw_circle)
并运行函数,该函数将在画布和draw 上绘制圆圈,可以保存。
# display on canvas
self.canvas.create_oval((event.x-5, event.y-5, event.x+5, event.y+5), width=2, outline='#FF0000')
# draw on self.image
self.draw.ellipse((event.x-5, event.y-5, event.x+5, event.y+5), width=2, outline=(255,0,0))
以后你可以保存它
self.image.save('output.jpg')
顺便说一句:如果您使用Canvas 显示图像,则不需要使用Label。
最少的工作代码。
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk, Image, ImageDraw
class App():
def __init__(self):
self.window = tk.Tk()
self.window.after(100, self.selecting_file)
self.window.mainloop()
def selecting_file(self):
self.file_path = filedialog.askopenfilename()
#self.file_path = filedialog.askopenfilename(initialdir='images/', initialfile='example.jpg')
self.image = Image.open(self.file_path)
self.width, self.height = self.image.size
self.draw = ImageDraw.Draw(self.image)
self.photo = ImageTk.PhotoImage(image=self.image)
self.canvas = tk.Canvas(self.window, width=self.width, height=self.height)
self.canvas.pack()
self.canvas.bind('<Button-1>', self.draw_circle)
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
self.save_button = tk.Button(self.window, text='Save', command=self.save)
self.save_button.pack()
def draw_circle(self, event):
# display on canvas
self.canvas.create_oval((event.x-5, event.y-5, event.x+5, event.y+5), width=2, outline='#FF0000')
# draw on self.image
self.draw.ellipse((event.x-5, event.y-5, event.x+5, event.y+5), width=2, outline=(255,0,0))
def save(self):
self.image.save('output.jpg')
# --- main ---
App()
编辑:
带有更改颜色、图形和半径的按钮的版本。
import tkinter as tk
from tkinter import filedialog, colorchooser
from PIL import ImageTk, Image, ImageDraw
class App():
def __init__(self):
self.color = '#FF0000'
self.figure = 'circle'
self.figure = 'rectangle'
self.size = 5
self.window = tk.Tk()
self.window.after(100, self.selecting_file)
self.window.mainloop()
def selecting_file(self):
self.file_path = filedialog.askopenfilename()
#self.file_path = filedialog.askopenfilename(initialdir='images/', initialfile='example.jpg')
self.image = Image.open(self.file_path)
self.width, self.height = self.image.size
self.draw = ImageDraw.Draw(self.image)
self.photo = ImageTk.PhotoImage(image=self.image)
self.frame_tools = tk.Frame(self.window)
self.frame_tools.pack()
self.rectangle_button = tk.Button(self.frame_tools, text='Rectangle', command=lambda:self.change_figure('rectangle'))
self.rectangle_button.pack(side='left')
self.circle_button = tk.Button(self.frame_tools, text='Circle', command=lambda:self.change_figure('circle'))
self.circle_button.pack(side='left')
self.size_entry = tk.Entry(self.frame_tools)
self.size_entry.bind('<Return>', self.change_size)
self.size_entry.pack(side='left')
self.color_button = tk.Button(self.frame_tools, text='Color: #FF0000', command=self.change_color)
self.color_button.pack(side='left')
self.canvas = tk.Canvas(self.window, width=self.width, height=self.height)
self.canvas.pack()
self.canvas.bind('<Button-1>', self.on_click)
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
self.save_button = tk.Button(self.window, text='Save', command=self.save)
self.save_button.pack()
def on_click(self, event):
if self.figure == 'circle':
self.draw_circle(event)
elif self.figure == 'rectangle':
self.draw_rectangle(event)
def draw_circle(self, event):
x1 = event.x - self.size
y1 = event.y - self.size
x2 = event.x + self.size
y2 = event.y + self.size
# display on canvas
self.canvas.create_oval((x1, y1, x2, y2), width=2, outline=self.color)
# draw on self.image
self.draw.ellipse((x1, y1, x2, y2), width=2, outline=self.color)
def draw_rectangle(self, event):
x1 = event.x - self.size
y1 = event.y - self.size
x2 = event.x + self.size
y2 = event.y + self.size
# display on canvas
self.canvas.create_rectangle((x1, y1, x2, y2), width=2, outline=self.color)
# draw on self.image
self.draw.rectangle((x1, y1, x2, y2), width=2, outline=self.color)
def save(self):
self.image.save('output.jpg')
def change_color(self):
rgb, color_string = colorchooser.askcolor(initialcolor=self.color)
#print(rgb, color_string)
if color_string:
self.color = color_string
self.color_button['text'] = 'Color: ' + color_string
def change_figure(self, figure):
self.figure = figure
def change_size(self, event=None):
try:
self.size = int(self.size_entry.get())
except Exceptions as ex:
print(ex)
# --- main ---
App()