如何在图像上绘制 Tkinter canvas,PIL

How to draw on an image Tkinter canvas, PIL

我希望能够在 tkinter canvas PIL 显示的图像上绘图。我尝试了 google 搜索,但所有结果都是如何在没有 tkinter 的情况下绘制图像或如何显示不是我想要的图像。我也希望它像现场一样(移动鼠标时的颜色)。有什么办法可以做到这一点。如果 PIL 没有办法,tkinter 有没有办法。

回答

这个post的答案 如果 link 在这里不起作用是代码:

from tkinter import *
from tkinter import ttk

class Sketchpad(Canvas):
    def __init__(self, parent, **kwargs):
        super().__init__(parent, **kwargs)
        self.bind("<Button-1>", self.save_posn)
        self.bind("<B1-Motion>", self.add_line)
        
    def save_posn(self, event):
        self.lastx, self.lasty = event.x, event.y

    def add_line(self, event):
        self.create_line((self.lastx, self.lasty, event.x, event.y), width=20, capstyle='round')
        self.save_posn(event)

root = Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

sketch = Sketchpad(root)
sketch.grid(column=0, row=0, sticky=(N, W, E, S))

root.mainloop()

我认为最好的方法是使用 tkinter 进行绘图,否则每次 PIL 更改图像时您都需要不断更新 canvas 小部件(可能是太慢了,会干扰“实时”绘图。

tkinter Canvases 具有几种不同的矢量和文本绘图功能,您可以 draw/display 它们 在图像的顶部 也被它展示。这意味着如果您首先添加图像,则绘制的任何其他内容都会出现在该图像之上(如果它与图像重叠)。

下面是这样做的演示。请注意,我从 python-course.eu page: Canvas Widgets in Tkinter 中借用了一些代码和示例图像。它描述了 Canvas 小部件提供的绘图工具。

from PIL import Image, ImageTk
import tkinter as tk
from tkinter.constants import *

canvas_width, canvas_height = 300, 300

root = tk.Tk()

canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
canvas.pack()

img = ImageTk.PhotoImage(file='rocks.png')
canvas.create_image(20, 20, anchor=NW, image=img)

# Draw something on top of image.
points = [100, 140, 110, 110, 140, 100, 110, 90, 100, 60, 90, 90, 60, 100, 90, 110]
canvas.create_polygon(points, outline='green', fill='yellow', width=3)

root.mainloop()

这是代码使用的 rocks.png 图片。

结果截图: