tkinter图像处理界面【借鉴】

界面展示

tkinter图像处理界面【借鉴】_第1张图片

代码展示

from PIL import Image as Im
from PIL import ImageTk
import tkinter as tk  # 导入 Tkinter 库
from tkinter.filedialog import askopenfilename
import tkinter.messagebox
import tkinter.ttk
import tkinter.messagebox
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageEnhance

class Win(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('图像简易处理及滤镜工具')
        self.geometry('1080x720')
        self.picture = None  # self.picture将作为picture类的实例化对象
        self.img = None  # self.img将作为窗口类中一直变动的PIL对象图片
        self.setupUI()


    def setupUI(self):
        # 左边菜单栏
        left_f = tk.Frame(self, height=720, width=360)
        left_f.pack(side=tk.LEFT)

        # 各种功能按钮名称及位置
        btn1 = tk.Button(left_f, text='打开图像', command=self.openToshow)
        btn1.place(y=25, x=30, width=300, height=40)
        btn2 = tk.Button(left_f, text='截图', command=self.window_cut)
        btn2.place(y=85, x=30, width=144, height=60)
        btn3 = tk.Button(left_f, text='大小', command=self.window_size)
        btn3.place(y=85, x=186, width=144, height=60)
        btn4 = tk.Button(left_f, text='旋转', command=self.window_rotate)
        btn4.place(y=165, x=30, width=144, height=60)
        btn5 = tk.Button(left_f, text='镜像', command=self.window_mirror)
        btn5.place(y=165, x=186, width=144, height=60)
        btn6 = tk.Button(left_f, text='文字', command=self.window_word)
        btn6.place(y=245, x=30, width=144, height=60)
        btn7 = tk.Button(left_f, text='滤镜', command=self.window_style)
        btn7.place(y=245, x=186, width=144, height=60)

        # 各种调整名称及位置
        lb1 = tk.Label(left_f, text='亮 度:')
        lb1.place(y=355, x=55, width=60, height=30)
        self.inp1 = tk.Entry(left_f)
        self.inp1.place(y=355, x=105, width=90, height=30)
        lb2 = tk.Label(left_f, text='%')
        lb2.place(y=355, x=205, width=13, height=30)
        b1 = tk.Button(left_f, text='确定', width=8, command=self.brightnessPic)
        b1.place(y=359, x=240)

        lb3 = tk.Label(left_f, text='色彩度:')
        lb3.place(y=400, x=55, width=60, height=30)
        self.inp2 = tk.Entry(left_f)
        self.inp2.place(y=400, x=105, width=90, height=30)
        lb4 = tk.Label(left_f, text='%')
        lb4.place(y=400, x=205, width=13, height=30)
        b2 = tk.Button(left_f, text='确定', width=8, command=self.coolorPic)
        b2.place(y=404, x=240)

        lb5 = tk.Label(left_f, text='对比度:')
        lb5.place(y=445, x=55, width=60, height=30)
        self.inp3 = tk.Entry(left_f)
        self.inp3.place(y=445, x=105, width=90, height=30)
        lb6 = tk.Label(left_f, text='%')
        lb6.place(y=445, x=205, width=13, height=30)
        b3 = tk.Button(left_f, text='确定', width=8, command=self.contrastPic)
        b3.place(y=449, x=240)

        lb7 = tk.Label(left_f, text='锐 度:')
        lb7.place(y=490, x=55, width=60, height=30)
        self.inp4 = tk.Entry(left_f)
        self.inp4.place(y=490, x=105, width=90, height=30)
        lb8 = tk.Label(left_f, text='%')
        lb8.place(y=490, x=205, width=13, height=30)
        b4 = tk.Button(left_f, text='确定', width=8, command=self.sharpnessPic)
        b4.place(y=494, x=240)

        # 底部恢复、保存、对比
        btn8 = tk.Button(left_f, text='保存图像', command=self.save_pic)
        btn8.place(y=600, x=150, width=180, height=30)
        btn9 = tk.Button(left_f, text='恢复图像', command=self.replay)
        btn9.place(y=550, x=90)
        btn10 = tk.Button(left_f, text='对比图像', command=self.compare)
        btn10.place(y=550, x=170)

        # 右侧图像显示栏
        right_f = tk.Frame(self, height=720, width=720)
        right_f.pack(side=tk.RIGHT)
        self.image_l = tk.Label(right_f, relief='ridge')
        self.image_l.place(x=0, y=0, width=720, height=720)

    # 打开图片时使用,传值(图)给展示函数
    def openToshow(self):
        address = self.getAddress()
        self.open_picToimg = self.picture.open_pic(address)
        self.firstPic(self.open_picToimg)
        self.show_img(self.open_picToimg)
        
	# 打开图片时使用,获得地址
    def getAddress(self):
        path = tk.StringVar()
        file_entry = tk.Entry(self, state='readonly', text=path)
        path_ = askopenfilename()
        path.set(path_)
        self.picture = picture()
        return file_entry.get()

	# 展示函数
    def show_img(self, n_img):
        self.img = n_img  # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
        img_show = ImageTk.PhotoImage(self.img)
        self.image_l.config(image=img_show)
        self.image_l.image = img_show
        return self.img

	# 保存函数
    def save_pic(self):
        fname = tkinter.filedialog.asksaveasfilename(title='保存文件', filetypes=[("PNG", ".png")])
        self.img.save(str(fname))  # PIL保存

    # 打开图像调用
    def open_pic(self, address):
        self.pic_get = Im.open(address).convert('RGBA')
        wid, hei = self.pic_get.size
        if wid > 600 or hei > 400:
            if tk.messagebox.askokcancel('提示', '图片可能过大,是否压缩?'):
                needShow_pic = self.openResize()
                return needShow_pic
            return self.pic_get
        else:
            return self.pic_get

    # 展示函数
    def show_img(self, n_img):
        self.img = n_img  # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
        img_show = ImageTk.PhotoImage(self.img)
        self.image_l.config(image=img_show)
        self.image_l.image = img_show
        return self.img
	
	# 原图储存
    def firstPic(self, pic):
        self.Fpic = pic
        return self.Fpic

    # 打开图像时的图像压缩展示
    def openResize(self):
        w, h = self.pic_get.size
        w_hope = 500
        h_hope = 300
        f1 = 1.0 * w_hope / w
        f2 = 1.0 * h_hope / h
        factor = min([f1, f2])
        width = int(w * factor)
        height = int(h * factor)
        pic_show = self.pic_get.resize((width, height))
        return pic_show


    # 截图操作页面
    def window_cut(self):
        Cut_win = tk.Toplevel()
        Cut_win.title('截图操作')
        Cut_win.geometry('220x380')
        nowPic = self.img
        if self.img == None:
            lNone = tk.Label(Cut_win, text='请先打开一张图片')
            lNone.place(y=55, x=50)
        else:
            wNow, hNow = nowPic.size
            l1 = tk.Label(Cut_win, text="此时图片尺寸:")
            l1.place(y=30, x=25)
            l2 = tk.Label(Cut_win, text=wNow)
            l2.place(y=55, x=25)
            l3 = tk.Label(Cut_win, text="X")
            l3.place(y=55, x=65)
            l4 = tk.Label(Cut_win, text=hNow)
            l4.place(y=55, x=85)
            l5 = tk.Label(Cut_win, text="截图区域")
            l5.place(y=85, x=25)
            l6 = tk.Label(Cut_win, text="起始点:(左上为(0,0))")
            l6.place(y=115, x=25)
            l7 = tk.Label(Cut_win, text="x:")
            l7.place(y=145, x=25)
            self.e1 = tk.Entry(Cut_win, width=10)
            self.e1.place(y=145, x=55)
            l8 = tk.Label(Cut_win, text="y:")
            l8.place(y=180, x=25)
            self.e2 = tk.Entry(Cut_win, width=10)
            self.e2.place(y=180, x=55)
            l9 = tk.Label(Cut_win, text="终止点:")
            l9.place(y=220, x=25)
            l10 = tk.Label(Cut_win, text="x:")
            l10.place(y=250, x=25)
            self.e3 = tk.Entry(Cut_win, width=10)
            self.e3.place(y=250, x=55)
            l11 = tk.Label(Cut_win, text="y:")
            l11.place(y=285, x=25)
            self.e4 = tk.Entry(Cut_win, width=10)
            self.e4.place(y=285, x=55)
            b1 = tk.Button(Cut_win, text='确定', command=self.getCutpart)
            b1.place(y=320, x=80, width=40)
            b2 = tk.Button(Cut_win, text='完成', command=Cut_win.destroy)
            b2.place(y=350, x=150, width=40)

 	# 大小尺寸操作窗口
    def window_size(self):
        Size_win = tk.Toplevel()
        Size_win.title('尺寸操作')
        Size_win.geometry('200x180')
        l1 = tk.Label(Size_win, text="宽:")
        l1.place(y=30, x=25)
        self.text1 = tk.Entry(Size_win, width=10)
        self.text1.place(y=25, x=50)
        l1_1 = tk.Label(Size_win, text="px")
        l1_1.place(y=28, x=150)
        l2 = tk.Label(Size_win, text="高:")
        l2.place(y=60, x=25)
        self.text2 = tk.Entry(Size_win, width=10)
        self.text2.place(y=55, x=50)
        l2_1 = tk.Label(Size_win, text="px")
        l2_1.place(y=58, x=150)
        b1 = tk.Button(Size_win, text='确定', command=self.getSize_change)
        b1.place(y=100, x=80, width=40)
        b2 = tk.Button(Size_win, text='完成', command=Size_win.destroy)
        b2.place(y=145, x=140, width=40)

    # 接收截图区域,传送展示
    def getCutpart(self):
        nCut_pic = self.img
        x = int(self.e1.get())
        y = int(self.e2.get())
        xl = int(self.e3.get())
        yl = int(self.e4.get())
        self.picture = picture()
        showCut_pic = self.picture.Cutpic(nCut_pic, x, y, xl, yl)
        self.show_img(showCut_pic)

	# 获得输入尺寸
    def getSize_change(self):
        sizeNum_w = int(self.text1.get())
        sizeNum_h = int(self.text2.get())
        # print('1')
        self.showSize_change(sizeNum_w, sizeNum_h)
        # print(sizeNum_w, sizeNum_h)

	# 尺寸修改并展示图片
    def showSize_change(self, renewSize_w, renewSize_h):
        # print('2')
        self.picture = picture()
        needResize_pic = self.img
        show_resizePic = self.picture.changeResize(needResize_pic, renewSize_w, renewSize_h)
        self.show_img(show_resizePic)

   	# 文字添加功能窗口
    def window_word(self):
        Word_win = tk.Toplevel()
        Word_win.title('镜像操作')
        Word_win.geometry('200x250')
        l1 = tk.Label(Word_win, text='请输入文字:')
        l1.place(y=20, x=25, width=80)
        self.textWord = tk.Entry(Word_win, width=17)
        self.textWord.place(y=45, x=15)
        l2 = tk.Label(Word_win, text='请选择文字颜色:')
        l2.place(y=85, x=25, width=105)
        b1 = tk.Button(Word_win, text='红色', width=8, command=lambda: self.getWord_input('red'))
        b1.place(y=120, x=20)
        b2 = tk.Button(Word_win, text='黑色', width=8, command=lambda: self.getWord_input('black'))
        b2.place(y=120, x=100)
        b3 = tk.Button(Word_win, text='蓝色', width=8, command=lambda: self.getWord_input('blue'))
        b3.place(y=150, x=20)
        b4 = tk.Button(Word_win, text='绿色', width=8, command=lambda: self.getWord_input('green'))
        b4.place(y=150, x=100)
        b5 = tk.Button(Word_win, text='黄色', width=8, command=lambda: self.getWord_input('yellow'))
        b5.place(y=180, x=20)
        b6 = tk.Button(Word_win, text='白色', width=8, command=lambda: self.getWord_input('white'))
        b6.place(y=180, x=100)
        b7 = tk.Button(Word_win, text='完成', command=Word_win.destroy)
        b7.place(y=220, x=150)

	# 图像旋转操作窗口
    def window_rotate(self):
        Rot_win = tk.Toplevel()
        Rot_win.title('旋转')
        Rot_win.geometry('225x220')
        l1 = tk.Label(Rot_win, text="角度:")
        l1.place(y=20, x=10)
        self.inpt = tk.Entry(Rot_win, width=13)
        self.inpt.place(y=15, x=50)
        b0 = tk.Button(Rot_win, text='确定', command=lambda: self.getDegree('1'))
        b0.place(y=55, x=160, width=40)
        b1 = tk.Button(Rot_win, text='+90', command=lambda: self.getDegree('2'))
        b1.place(y=85, x=60, width=95)
        b2 = tk.Button(Rot_win, text='-90', command=lambda: self.getDegree('3'))
        b2.place(y=115, x=60, width=95)
        b3 = tk.Button(Rot_win, text='180', command=lambda: self.getDegree('4'))
        b3.place(y=145, x=60, width=95)
        b4 = tk.Button(Rot_win, text='完成', command=Rot_win.destroy)
        b4.place(y=180, x=160, width=40)

	# 旋转角度获取
    def getDegree(self, n):
        self.picture = picture()
        needRotate_pic = self.img
        # print('99')
        # print(n)
        if n == '1':
            shouldDegree = float(self.inpt.get())
            # print('36')
            # print(shouldDegree)
            showRotate_pic = self.picture.rotatePic(needRotate_pic, shouldDegree)
        elif n == '2':
            # print('34')
            showRotate_pic = self.picture.rotatePic(needRotate_pic, +90)
        elif n == '3':
            showRotate_pic = self.picture.rotatePic(needRotate_pic, -90)
        elif n == '4':
            showRotate_pic = self.picture.rotatePic(needRotate_pic, 180)
        else:
            return 0
        self.show_img(showRotate_pic)

    # 滤镜选择窗口
    def window_style(self):
        Sty_win = tk.Toplevel()
        Sty_win.title('滤镜选择')
        Sty_win.geometry('230x180')
        bt1 = tk.Button(Sty_win, text='图像模糊', command=self.sty_1)
        bt1.place(y=25, x=25, width=80)
        bt2 = tk.Button(Sty_win, text='轮廓滤波', command=self.sty_2)
        bt2.place(y=25, x=115, width=80)
        bt3 = tk.Button(Sty_win, text='高斯模糊', command=self.sty_3)
        bt3.place(y=65, x=25, width=80)
        bt4 = tk.Button(Sty_win, text='浮雕滤镜', command=self.sty_4)
        bt4.place(y=65, x=115, width=80)
        bt5 = tk.Button(Sty_win, text='边界滤镜', command=self.sty_5)
        bt5.place(y=105, x=25, width=80)
        bt6 = tk.Button(Sty_win, text='完成', command=Sty_win.destroy)
        bt6.place(y=140, x=160)

  	# 图像模糊获取展示
    def sty_1(self):
        sty_1_pic = self.img
        relSty_1 = style_Huminghao.blurPic(sty_1_pic)
        self.show_img(relSty_1)

	# 边界增强获取展示
    def sty_2(self):
        sty_2_pic = self.img
        reSty_2 = style_Huminghao.edge(sty_2_pic)
        self.show_img(reSty_2)

	# 高斯模糊获取展示
    def sty_3(self):
        sty_3_pic = self.img
        reSty_3 = style_Huminghao.gaussianBlur(sty_3_pic)
        self.show_img(reSty_3)

	# 浮雕滤镜获取展示
    def sty_4(self):
        sty_4_pic = self.img
        reSty_4 = style_Huminghao.emboss(sty_4_pic)
        self.show_img(reSty_4)

	# 边界滤镜获取展示
    def sty_5(self):
        sty_5_pic = self.img
        reSty_5 = style_Huminghao.ffind_edeges(sty_5_pic)
        self.show_img(reSty_5)

    # 亮度调整
    def brightnessPic(self):
        self.picture = picture()
        needBright_pic = self.img
        b_num = float(self.inp1.get())
        briNum = b_num / 100
        showBright_pic = self.picture.brightPic(needBright_pic, briNum)
        self.show_img(showBright_pic)

	# 色彩度调整
    def coolorPic(self):
        self.picture = picture()
        needColor_pic = self.img
        co_num = float(self.inp2.get())
        colNum = co_num / 100
        showColor_pic = self.picture.colornPic(needColor_pic, colNum)
        self.show_img(showColor_pic)

	# 对比度调整
    def contrastPic(self):
        self.picture = picture()
        needCon_pic = self.img
        c_num = float(self.inp3.get())
        ConNum = c_num / 100
        showContrast_pic = self.picture.constractPic(needCon_pic, ConNum)
        self.show_img(showContrast_pic)

	# 锐度调整
    def sharpnessPic(self):
        self.picture = picture()
        needSharp_pic = self.img
        s_num = float(self.inp4.get())
        ShNum = s_num / 100
        showSharp_pic = self.picture.constractPic(needSharp_pic, ShNum)
        self.show_img(showSharp_pic)



	# 获得文字添加的相关对象
    def getWord_input(self, color):
        self.picture = picture()
        needWord_pic = self.img
        showWord = self.textWord.get()
        # print(showWord)
        # print(color)
        showInword_pic = self.picture.wordInput(needWord_pic, showWord, color)
        self.show_img(showInword_pic)

	# 镜像操作窗口
    def window_mirror(self):
        Mir_win = tk.Toplevel()
        Mir_win.title('镜像操作')
        Mir_win.geometry('150x150')
        b1 = tk.Button(Mir_win, text='左右', command=self.MirrorImg_lr)
        b1.place(y=30, x=35, width=75)
        b2 = tk.Button(Mir_win, text='上下', command=self.MirrorImg_tb)
        b2.place(y=60, x=35, width=75)
        b3 = tk.Button(Mir_win, text='完成', command=Mir_win.destroy)
        b3.place(y=110, x=80, width=40)

	# 镜像左右调用展示
    def MirrorImg_lr(self):
        self.picture = picture()
        Mirror_img_lr = self.img
        MittotImg_lrFinish = self.picture.MirrorPic_leftOrright(Mirror_img_lr)
        self.show_img(MittotImg_lrFinish)

	# 镜像上下调用展示
    def MirrorImg_tb(self):
        self.picture = picture()
        Mirror_img_tb = self.img
        MittotImg_tbFinish = self.picture.MirrorPic_topOrbuttom(Mirror_img_tb)
        self.show_img(MittotImg_tbFinish)

    # 恢复图像
    def replay(self):
        self.show_img(self.Fpic)

	# 对比图像
    def compare(self):
        Im._show(self.Fpic)

if __name__ == '__main__':
    root = Win()
    # 窗体主循环
    root.mainloop()

更新:7/27/2022

今天要用这个界面,回来稍微改了下,实例化了picture类,完整代码如下:

from PIL import Image as Im
from PIL import ImageTk
import tkinter as tk  # 导入 Tkinter 库
from tkinter.filedialog import askopenfilename
import tkinter.messagebox
import tkinter.ttk
import tkinter.messagebox
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageEnhance

class picture:
    def __init__(self):
        NotImplemented

    # 打开图像调用
    def open_pic(self, address):
        self.pic_get = Im.open(address).convert('RGBA')
        wid, hei = self.pic_get.size
        if wid > 600 or hei > 400:
            if tk.messagebox.askokcancel('提示', '图片可能过大,是否压缩?'):
                needShow_pic = self.openResize()
                return needShow_pic
            return self.pic_get
        else:
            return self.pic_get

    # 打开图像时的图像压缩展示
    def openResize(self):
        w, h = self.pic_get.size
        w_hope = 500
        h_hope = 300
        f1 = 1.0 * w_hope / w
        f2 = 1.0 * h_hope / h
        factor = min([f1, f2])
        width = int(w * factor)
        height = int(h * factor)
        pic_show = self.pic_get.resize((width, height))
        return pic_show

class Win(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('图像简易处理及滤镜工具')
        self.geometry('1080x720')
        self.picture = None  # self.picture将作为picture类的实例化对象
        self.img = None  # self.img将作为窗口类中一直变动的PIL对象图片
        self.setupUI()


    def setupUI(self):
        # 左边菜单栏
        left_f = tk.Frame(self, height=720, width=360)
        left_f.pack(side=tk.LEFT)

        # 各种功能按钮名称及位置
        btn1 = tk.Button(left_f, text='打开图像', command=self.openToshow)
        btn1.place(y=25, x=30, width=300, height=40)
        btn2 = tk.Button(left_f, text='截图', command=self.window_cut)
        btn2.place(y=85, x=30, width=144, height=60)
        btn3 = tk.Button(left_f, text='大小', command=self.window_size)
        btn3.place(y=85, x=186, width=144, height=60)
        btn4 = tk.Button(left_f, text='旋转', command=self.window_rotate)
        btn4.place(y=165, x=30, width=144, height=60)
        btn5 = tk.Button(left_f, text='镜像', command=self.window_mirror)
        btn5.place(y=165, x=186, width=144, height=60)
        btn6 = tk.Button(left_f, text='文字', command=self.window_word)
        btn6.place(y=245, x=30, width=144, height=60)
        btn7 = tk.Button(left_f, text='滤镜', command=self.window_style)
        btn7.place(y=245, x=186, width=144, height=60)

        # 各种调整名称及位置
        lb1 = tk.Label(left_f, text='亮 度:')
        lb1.place(y=355, x=55, width=60, height=30)
        self.inp1 = tk.Entry(left_f)
        self.inp1.place(y=355, x=105, width=90, height=30)
        lb2 = tk.Label(left_f, text='%')
        lb2.place(y=355, x=205, width=13, height=30)
        b1 = tk.Button(left_f, text='确定', width=8, command=self.brightnessPic)
        b1.place(y=359, x=240)

        lb3 = tk.Label(left_f, text='色彩度:')
        lb3.place(y=400, x=55, width=60, height=30)
        self.inp2 = tk.Entry(left_f)
        self.inp2.place(y=400, x=105, width=90, height=30)
        lb4 = tk.Label(left_f, text='%')
        lb4.place(y=400, x=205, width=13, height=30)
        b2 = tk.Button(left_f, text='确定', width=8, command=self.coolorPic)
        b2.place(y=404, x=240)

        lb5 = tk.Label(left_f, text='对比度:')
        lb5.place(y=445, x=55, width=60, height=30)
        self.inp3 = tk.Entry(left_f)
        self.inp3.place(y=445, x=105, width=90, height=30)
        lb6 = tk.Label(left_f, text='%')
        lb6.place(y=445, x=205, width=13, height=30)
        b3 = tk.Button(left_f, text='确定', width=8, command=self.contrastPic)
        b3.place(y=449, x=240)

        lb7 = tk.Label(left_f, text='锐 度:')
        lb7.place(y=490, x=55, width=60, height=30)
        self.inp4 = tk.Entry(left_f)
        self.inp4.place(y=490, x=105, width=90, height=30)
        lb8 = tk.Label(left_f, text='%')
        lb8.place(y=490, x=205, width=13, height=30)
        b4 = tk.Button(left_f, text='确定', width=8, command=self.sharpnessPic)
        b4.place(y=494, x=240)

        # 底部恢复、保存、对比
        btn8 = tk.Button(left_f, text='保存图像', command=self.save_pic)
        btn8.place(y=600, x=150, width=180, height=30)
        btn9 = tk.Button(left_f, text='恢复图像', command=self.replay)
        btn9.place(y=550, x=90)
        btn10 = tk.Button(left_f, text='对比图像', command=self.compare)
        btn10.place(y=550, x=170)

        # 右侧图像显示栏
        right_f = tk.Frame(self, height=720, width=720)
        right_f.pack(side=tk.RIGHT)
        self.image_l = tk.Label(right_f, relief='ridge')
        self.image_l.place(x=0, y=0, width=720, height=720)

    # 打开图片时使用,传值(图)给展示函数
    def openToshow(self):
        address = self.getAddress()
        self.open_picToimg = self.picture.open_pic(address)
        self.firstPic(self.open_picToimg)
        self.show_img(self.open_picToimg)
        
	# 打开图片时使用,获得地址
    def getAddress(self):
        path = tk.StringVar()
        file_entry = tk.Entry(self, state='readonly', text=path)
        path_ = askopenfilename()
        path.set(path_)
        self.picture = picture()
        return file_entry.get()

	# 展示函数
    def show_img(self, n_img):
        self.img = n_img  # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
        img_show = ImageTk.PhotoImage(self.img)
        self.image_l.config(image=img_show)
        self.image_l.image = img_show
        return self.img

	# 保存函数
    def save_pic(self):
        fname = tkinter.filedialog.asksaveasfilename(title='保存文件', filetypes=[("PNG", ".png")])
        self.img.save(str(fname))  # PIL保存

    # 展示函数
    def show_img(self, n_img):
        self.img = n_img  # self.img PIL对象方便传值给picture类以及本类中其他需要使用PIL图像的地方
        img_show = ImageTk.PhotoImage(self.img)
        self.image_l.config(image=img_show)
        self.image_l.image = img_show
        return self.img
	
	# 原图储存
    def firstPic(self, pic):
        self.Fpic = pic
        return self.Fpic

    # 截图操作页面
    def window_cut(self):
        Cut_win = tk.Toplevel()
        Cut_win.title('截图操作')
        Cut_win.geometry('220x380')
        nowPic = self.img
        if self.img == None:
            lNone = tk.Label(Cut_win, text='请先打开一张图片')
            lNone.place(y=55, x=50)
        else:
            wNow, hNow = nowPic.size
            l1 = tk.Label(Cut_win, text="此时图片尺寸:")
            l1.place(y=30, x=25)
            l2 = tk.Label(Cut_win, text=wNow)
            l2.place(y=55, x=25)
            l3 = tk.Label(Cut_win, text="X")
            l3.place(y=55, x=65)
            l4 = tk.Label(Cut_win, text=hNow)
            l4.place(y=55, x=85)
            l5 = tk.Label(Cut_win, text="截图区域")
            l5.place(y=85, x=25)
            l6 = tk.Label(Cut_win, text="起始点:(左上为(0,0))")
            l6.place(y=115, x=25)
            l7 = tk.Label(Cut_win, text="x:")
            l7.place(y=145, x=25)
            self.e1 = tk.Entry(Cut_win, width=10)
            self.e1.place(y=145, x=55)
            l8 = tk.Label(Cut_win, text="y:")
            l8.place(y=180, x=25)
            self.e2 = tk.Entry(Cut_win, width=10)
            self.e2.place(y=180, x=55)
            l9 = tk.Label(Cut_win, text="终止点:")
            l9.place(y=220, x=25)
            l10 = tk.Label(Cut_win, text="x:")
            l10.place(y=250, x=25)
            self.e3 = tk.Entry(Cut_win, width=10)
            self.e3.place(y=250, x=55)
            l11 = tk.Label(Cut_win, text="y:")
            l11.place(y=285, x=25)
            self.e4 = tk.Entry(Cut_win, width=10)
            self.e4.place(y=285, x=55)
            b1 = tk.Button(Cut_win, text='确定', command=self.getCutpart)
            b1.place(y=320, x=80, width=40)
            b2 = tk.Button(Cut_win, text='完成', command=Cut_win.destroy)
            b2.place(y=350, x=150, width=40)

 	# 大小尺寸操作窗口
    def window_size(self):
        Size_win = tk.Toplevel()
        Size_win.title('尺寸操作')
        Size_win.geometry('200x180')
        l1 = tk.Label(Size_win, text="宽:")
        l1.place(y=30, x=25)
        self.text1 = tk.Entry(Size_win, width=10)
        self.text1.place(y=25, x=50)
        l1_1 = tk.Label(Size_win, text="px")
        l1_1.place(y=28, x=150)
        l2 = tk.Label(Size_win, text="高:")
        l2.place(y=60, x=25)
        self.text2 = tk.Entry(Size_win, width=10)
        self.text2.place(y=55, x=50)
        l2_1 = tk.Label(Size_win, text="px")
        l2_1.place(y=58, x=150)
        b1 = tk.Button(Size_win, text='确定', command=self.getSize_change)
        b1.place(y=100, x=80, width=40)
        b2 = tk.Button(Size_win, text='完成', command=Size_win.destroy)
        b2.place(y=145, x=140, width=40)

    # 接收截图区域,传送展示
    def getCutpart(self):
        nCut_pic = self.img
        x = int(self.e1.get())
        y = int(self.e2.get())
        xl = int(self.e3.get())
        yl = int(self.e4.get())
        self.picture = picture()
        showCut_pic = self.picture.Cutpic(nCut_pic, x, y, xl, yl)
        self.show_img(showCut_pic)

	# 获得输入尺寸
    def getSize_change(self):
        sizeNum_w = int(self.text1.get())
        sizeNum_h = int(self.text2.get())
        # print('1')
        self.showSize_change(sizeNum_w, sizeNum_h)
        # print(sizeNum_w, sizeNum_h)

	# 尺寸修改并展示图片
    def showSize_change(self, renewSize_w, renewSize_h):
        # print('2')
        self.picture = picture()
        needResize_pic = self.img
        show_resizePic = self.picture.changeResize(needResize_pic, renewSize_w, renewSize_h)
        self.show_img(show_resizePic)

   	# 文字添加功能窗口
    def window_word(self):
        Word_win = tk.Toplevel()
        Word_win.title('镜像操作')
        Word_win.geometry('200x250')
        l1 = tk.Label(Word_win, text='请输入文字:')
        l1.place(y=20, x=25, width=80)
        self.textWord = tk.Entry(Word_win, width=17)
        self.textWord.place(y=45, x=15)
        l2 = tk.Label(Word_win, text='请选择文字颜色:')
        l2.place(y=85, x=25, width=105)
        b1 = tk.Button(Word_win, text='红色', width=8, command=lambda: self.getWord_input('red'))
        b1.place(y=120, x=20)
        b2 = tk.Button(Word_win, text='黑色', width=8, command=lambda: self.getWord_input('black'))
        b2.place(y=120, x=100)
        b3 = tk.Button(Word_win, text='蓝色', width=8, command=lambda: self.getWord_input('blue'))
        b3.place(y=150, x=20)
        b4 = tk.Button(Word_win, text='绿色', width=8, command=lambda: self.getWord_input('green'))
        b4.place(y=150, x=100)
        b5 = tk.Button(Word_win, text='黄色', width=8, command=lambda: self.getWord_input('yellow'))
        b5.place(y=180, x=20)
        b6 = tk.Button(Word_win, text='白色', width=8, command=lambda: self.getWord_input('white'))
        b6.place(y=180, x=100)
        b7 = tk.Button(Word_win, text='完成', command=Word_win.destroy)
        b7.place(y=220, x=150)

	# 图像旋转操作窗口
    def window_rotate(self):
        Rot_win = tk.Toplevel()
        Rot_win.title('旋转')
        Rot_win.geometry('225x220')
        l1 = tk.Label(Rot_win, text="角度:")
        l1.place(y=20, x=10)
        self.inpt = tk.Entry(Rot_win, width=13)
        self.inpt.place(y=15, x=50)
        b0 = tk.Button(Rot_win, text='确定', command=lambda: self.getDegree('1'))
        b0.place(y=55, x=160, width=40)
        b1 = tk.Button(Rot_win, text='+90', command=lambda: self.getDegree('2'))
        b1.place(y=85, x=60, width=95)
        b2 = tk.Button(Rot_win, text='-90', command=lambda: self.getDegree('3'))
        b2.place(y=115, x=60, width=95)
        b3 = tk.Button(Rot_win, text='180', command=lambda: self.getDegree('4'))
        b3.place(y=145, x=60, width=95)
        b4 = tk.Button(Rot_win, text='完成', command=Rot_win.destroy)
        b4.place(y=180, x=160, width=40)

	# 旋转角度获取
    def getDegree(self, n):
        self.picture = picture()
        needRotate_pic = self.img
        # print('99')
        # print(n)
        if n == '1':
            shouldDegree = float(self.inpt.get())
            # print('36')
            # print(shouldDegree)
            showRotate_pic = self.picture.rotatePic(needRotate_pic, shouldDegree)
        elif n == '2':
            # print('34')
            showRotate_pic = self.picture.rotatePic(needRotate_pic, +90)
        elif n == '3':
            showRotate_pic = self.picture.rotatePic(needRotate_pic, -90)
        elif n == '4':
            showRotate_pic = self.picture.rotatePic(needRotate_pic, 180)
        else:
            return 0
        self.show_img(showRotate_pic)

    # 滤镜选择窗口
    def window_style(self):
        Sty_win = tk.Toplevel()
        Sty_win.title('滤镜选择')
        Sty_win.geometry('230x180')
        bt1 = tk.Button(Sty_win, text='图像模糊', command=self.sty_1)
        bt1.place(y=25, x=25, width=80)
        bt2 = tk.Button(Sty_win, text='轮廓滤波', command=self.sty_2)
        bt2.place(y=25, x=115, width=80)
        bt3 = tk.Button(Sty_win, text='高斯模糊', command=self.sty_3)
        bt3.place(y=65, x=25, width=80)
        bt4 = tk.Button(Sty_win, text='浮雕滤镜', command=self.sty_4)
        bt4.place(y=65, x=115, width=80)
        bt5 = tk.Button(Sty_win, text='边界滤镜', command=self.sty_5)
        bt5.place(y=105, x=25, width=80)
        bt6 = tk.Button(Sty_win, text='完成', command=Sty_win.destroy)
        bt6.place(y=140, x=160)

  	# 图像模糊获取展示
    def sty_1(self):
        sty_1_pic = self.img
        relSty_1 = style_Huminghao.blurPic(sty_1_pic)
        self.show_img(relSty_1)

	# 边界增强获取展示
    def sty_2(self):
        sty_2_pic = self.img
        reSty_2 = style_Huminghao.edge(sty_2_pic)
        self.show_img(reSty_2)

	# 高斯模糊获取展示
    def sty_3(self):
        sty_3_pic = self.img
        reSty_3 = style_Huminghao.gaussianBlur(sty_3_pic)
        self.show_img(reSty_3)

	# 浮雕滤镜获取展示
    def sty_4(self):
        sty_4_pic = self.img
        reSty_4 = style_Huminghao.emboss(sty_4_pic)
        self.show_img(reSty_4)

	# 边界滤镜获取展示
    def sty_5(self):
        sty_5_pic = self.img
        reSty_5 = style_Huminghao.ffind_edeges(sty_5_pic)
        self.show_img(reSty_5)

    # 亮度调整
    def brightnessPic(self):
        self.picture = picture()
        needBright_pic = self.img
        b_num = float(self.inp1.get())
        briNum = b_num / 100
        showBright_pic = self.picture.brightPic(needBright_pic, briNum)
        self.show_img(showBright_pic)

	# 色彩度调整
    def coolorPic(self):
        self.picture = picture()
        needColor_pic = self.img
        co_num = float(self.inp2.get())
        colNum = co_num / 100
        showColor_pic = self.picture.colornPic(needColor_pic, colNum)
        self.show_img(showColor_pic)

	# 对比度调整
    def contrastPic(self):
        self.picture = picture()
        needCon_pic = self.img
        c_num = float(self.inp3.get())
        ConNum = c_num / 100
        showContrast_pic = self.picture.constractPic(needCon_pic, ConNum)
        self.show_img(showContrast_pic)

	# 锐度调整
    def sharpnessPic(self):
        self.picture = picture()
        needSharp_pic = self.img
        s_num = float(self.inp4.get())
        ShNum = s_num / 100
        showSharp_pic = self.picture.constractPic(needSharp_pic, ShNum)
        self.show_img(showSharp_pic)



	# 获得文字添加的相关对象
    def getWord_input(self, color):
        self.picture = picture()
        needWord_pic = self.img
        showWord = self.textWord.get()
        # print(showWord)
        # print(color)
        showInword_pic = self.picture.wordInput(needWord_pic, showWord, color)
        self.show_img(showInword_pic)

	# 镜像操作窗口
    def window_mirror(self):
        Mir_win = tk.Toplevel()
        Mir_win.title('镜像操作')
        Mir_win.geometry('150x150')
        b1 = tk.Button(Mir_win, text='左右', command=self.MirrorImg_lr)
        b1.place(y=30, x=35, width=75)
        b2 = tk.Button(Mir_win, text='上下', command=self.MirrorImg_tb)
        b2.place(y=60, x=35, width=75)
        b3 = tk.Button(Mir_win, text='完成', command=Mir_win.destroy)
        b3.place(y=110, x=80, width=40)

	# 镜像左右调用展示
    def MirrorImg_lr(self):
        self.picture = picture()
        Mirror_img_lr = self.img
        MittotImg_lrFinish = self.picture.MirrorPic_leftOrright(Mirror_img_lr)
        self.show_img(MittotImg_lrFinish)

	# 镜像上下调用展示
    def MirrorImg_tb(self):
        self.picture = picture()
        Mirror_img_tb = self.img
        MittotImg_tbFinish = self.picture.MirrorPic_topOrbuttom(Mirror_img_tb)
        self.show_img(MittotImg_tbFinish)

    # 恢复图像
    def replay(self):
        self.show_img(self.Fpic)

	# 对比图像
    def compare(self):
        Im._show(self.Fpic)

if __name__ == '__main__':
    root = Win()
    # 窗体主循环
    root.mainloop()

你可能感兴趣的:(计算机科学与技术,opencv,python,tkinter,gui,qt)