Image 使用Tkinter在标签图像上覆盖方框

Image 使用Tkinter在标签图像上覆盖方框,image,python-2.7,user-interface,tkinter,grid,Image,Python 2.7,User Interface,Tkinter,Grid,我正在使用Tkinter和grid()layout管理器创建GUI。我在GUI中使用标签在选项卡式窗口上显示图像: label2 = ttk.Label(tab2) image2 = PhotoImage(file="lizard.gif") label2['image'] = image2 label2.grid(column=0, row=0, columnspan=3) 为了进行说明,假设图像为300 x 900。如果我知道图像中的一组坐标,如何在图像上覆盖由已知坐标

我正在使用Tkinter和
grid()
layout管理器创建GUI。我在GUI中使用标签在选项卡式窗口上显示图像:

label2 = ttk.Label(tab2)
image2 = PhotoImage(file="lizard.gif")
label2['image'] = image2
label2.grid(column=0, row=0, columnspan=3)
为了进行说明,假设图像为300 x 900。如果我知道图像中的一组坐标,如何在图像上覆盖由已知坐标(a、B、C、D,仅用于图示)定义的着色框


您需要使用画布小部件。这将允许您绘制一个图像,然后在其上覆盖一个矩形。

让我给您一个逐步解决方案

您可以使用
tkinter.Label()
像以前一样显示图像,也可以选择其他小部件。但对于这种情况,让我们选择
tkinter.Canvas()
小部件(但如果您选择使用
tkinter.Label()
,同样的推理也是有效的)

技术问题: 您的问题包含两个要解决的主要子问题:

  • 如何以您想要的方式覆盖2个图像
  • 如何使用
    tkinter.Canvas()显示图像
要能够读取jpg格式的图像,您需要使用特定(或其fork)方法和类:

这是通过以下程序中的3行完成的:

self.im = Image.open(self.saved_image)
self.photo = ImageTk.PhotoImage(self.im)
然后在我们选择的
self.canvas
小部件中显示
self.photo

self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo)
第二,要再现您想要的效果,请使用OpenCV方法。但我觉得你已经做到了。因此,我只向您展示了执行此操作的程序代码部分:

self.img = cv2.imread(self.image_to_read)
self.overlay = self.img.copy()
cv2.rectangle(self.overlay, (500,50), (400,100), (0, 255, 0), -1)
self.opacity = 0.4
cv2.addWeighted(self.overlay, self.opacity, self.img, 1 - self.opacity, 0, self.img)
cv2.imwrite( self.saved_image, self.img)
程序设计: 我使用两种方法: -
\uuuu init\uuuu()
:准备框架并调用GUI初始化方法。 -
初始化用户界面()
:绘制GUI并执行前面的操作

但出于某些原因,最好创建一个单独的方法来处理图像的不同操作

完整程序(OpenCV+tkinter) 以下是源代码(我使用的是Python 3.4):

演示: 这是正在运行的程序的屏幕截图:


尽管上述答案非常深入,但它们并不适合我的具体情况(特别是使用Python 2.7等)。然而,这个解决方案正好满足了我的需求:

canvas = Canvas(tab2, width=875, height=400)
image2=PhotoImage(file='lizard.gif')
canvas.create_image(440,180,image=image2)
canvas.grid(column=0, row=0, columnspan=3)
使用以下方法将矩形添加到画布上:

x1 = 3, y1 = 10, x2 = 30, y2 = 20
canvas.create_rectangle(x1, y1, x2, y2, fill="blue", stipple="gray12")

点画
来自示例,有助于增加矩形的透明度。

这是一个极好的解决方案,并在第一个解决方案中进行了扩展。然而,我已经在使用“tkinter.label”的GUI周围构建了很多。正如您在解决方案的开头所提到的,我如何使用标签呢?如果您想使用
tkinter.label()
而不是
tkinter.Canvas()
,那么只需在我的代码中使用
self.Canvas
,创建一个标签并将图像
self.photo
像这样附加到它:
self.label=Tk.label(self.parent,image=self.photo)
并保留其余代码@dingogetter还添加了以下内容:
self.label.grid(row=0,column=0)
。其余代码保持原样,只需移除
self.canvas
并创建一个新的
label()
正如我所解释的。谢谢你的帮助。正如标题中所述,我使用的是Python 2.7——这会导致上面的代码无法运行,因此我正在尝试解决这个问题。我不认为我可以要求Python 2.7版本:d该程序在Python 2.7中保持不变。只需更改一件事:
将tkinter作为tk导入到
导入t Tkinter作为Tk
@DingoGetter
x1 = 3, y1 = 10, x2 = 30, y2 = 20
canvas.create_rectangle(x1, y1, x2, y2, fill="blue", stipple="gray12")