Image 使用Tkinter在标签图像上覆盖方框
我正在使用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。如果我知道图像中的一组坐标,如何在图像上覆盖由已知坐标
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()显示图像
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")