image - 使用 Tkinter 在标签图像上叠加一个框

标签 image python-2.7 user-interface tkinter grid

我正在使用 Tkinter 和 grid() 布局管理器来创建 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 定义仅出于说明目的而显示)坐标?

Illustration of concept

最佳答案

让我给你一步一步的解决方案。

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

技术问题:

您的问题包含 2 个需要解决的主要子问题:

  • 如何以您想要的方式叠加 2 张图片。
  • 如何使用 tkinter.Canvas()
  • 显示图像

为了能够读取 jpg 格式的图像,您需要使用特定的 PIL (或其Pillow 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)

其次,要重现您想要的效果,请使用 cv2.addWeighted() 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)

程序设计:

我使用两种方法: - __init__():准备框架并调用GUI初始化方法。 - initialize_user_interface():绘制GUI并执行前面的操作。

但是对于 scalability原因,最好创建一个单独的方法来处理图像的不同操作。

完整程序(OpenCV + tkinter)

这里是源代码(我用的是 Python 3.4):

'''
Created on Apr 05, 2016

@author: Bill Begueradj
'''
import tkinter as tk
from PIL import Image, ImageTk
import cv2
import numpy as np
import PIL



class Begueradj(tk.Frame):
    '''
    classdocs
    '''


    def __init__(self, parent):
        '''
        Prepare the frame and call the GUI initialization method.
        '''
        tk.Frame.__init__(self, parent)
        self.parent=parent
        self.initialize_user_interface()

    def initialize_user_interface(self):
        """Draw a user interface allowing the user to type        
        """
        self.parent.title("Bill BEGUERADJ: Image overlay with OpenCV + Tkinter")       
        self.parent.grid_rowconfigure(0,weight=1)
        self.parent.grid_columnconfigure(0,weight=1)

        self.image_to_read = 'begueradj.jpg'      
        self.saved_image = 'bill_begueradj.jpg'

        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)

        self.im = Image.open(self.saved_image)
        self.photo = ImageTk.PhotoImage(self.im)     

        self.canvas = tk.Canvas(self.parent, width = 580, height = 360)         

        self.canvas.grid(row = 0, column = 0)
        self.canvas.create_image(0,0, anchor=tk.N+tk.W, image = self.photo)


def main():
    root=tk.Tk()
    d=Begueradj(root)
    root.mainloop()

if __name__=="__main__":
    main()

演示:

这是运行程序的截图:

enter image description here

关于image - 使用 Tkinter 在标签图像上叠加一个框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36407116/

相关文章:

python - 如何将 python 3.4.3 链接到 opencv?

java - 如何将当前时间更改为用户时间

ios - UISearchController 中的取消按钮导致 SearchBar 故障

java拉绳直接图片

algorithm - 放大一张大图片

javascript - 如何在 javascript 中计算图像加载/渲染时间?

python - 这是 tkinter 中的不良编程习惯吗?

android - 在 webview 中加载保存在 sdcard 中的图像

arrays - Python 数组附加向量,然后按位置(而不是按元素)对数组的元素求和

python - 如何在 Python 中使用 Skype4Py 向群组对话发送消息