美文网首页pyqt学习笔记PyQtPython
PyQt+PIL做P图软件(终结版【附完整代码】)

PyQt+PIL做P图软件(终结版【附完整代码】)

作者: Stack_empty | 来源:发表于2018-03-09 23:16 被阅读210次

    时隔半年,我终于又有时间回到简书,接着写东西。主要是这半年时间都在忙着考研,以及忙其他的一些项目。后来某一天偶尔打开简书,发现十几条信息,很多人对这个“PyQt做软件”的项目很感兴趣,等我的后续,我才意识到自己肩膀上仿佛还有一些责任。。。毕竟我也知道跟着一个教程做项目,然后教程突然中断了是多么的难受。所以在这里给关注这个项目的人深深的道个歉!

    也许大家不再关注这个项目了,但是我还是觉得要有始有终。因为时隔久远,很多细节我也记不太清了,所以这次索性把代码全部贴出。代码中有很多我当时写的备注,应该很清晰了。

    有相关的疑问欢迎继续交流!

    下面进入正题:

    先给大家看看最后我做的软件的效果吧:

    Magpic 1.0版本

    应该来说。。。作为一个学Python不到半年而且是自学的我来说,这个效果还是很惊艳的是吧

    ヾ(◍°∇°◍)ノ゙ 你们说是不是呀~~哈哈哈

    展示一个各种功能:

    1.基本处理:

    打开一张图片,点右侧工具栏的各种功能:**

    打开图片 旋转 添加个性化水印
    2.魔法棒功能

    先找一张人物的,比如马云爸爸吧:

    马爸爸

    分别用右边的“油画”和“七彩”效果来做一做:

    马爸爸油画像 马爸爸七彩酷炫像

    这里注明一下,我没有用什么机器学习风格迁移的方法,就是简单的像素的变换[捂脸]...所以很简单,可以看源代码看看原理,大家也可以自己修改一些参数,可以呈现不同的效果。

    3.其他功能

    由于时间有限,而我们这个软件设置的功能很多,所以没法全部给大家展示了,就最后展示一个吧:把图片转成字符画:

    强东爸爸

    用软件里面的“转换字符画”的功能,变!↓↓↓

    压缩成字符画了

    还是挺有意思的对吧~~(。・ω・。)

    最后呢,附上完整的代码:

    共约1000行(其实很多都是重复类似的代码,而且PyQt自动生成了几百行,所以逻辑其实很简单的)

    # -*- coding: utf-8 -*-
    # Created by: PyQt5 UI code generator 5.6
    
    #3.17更新的功能:
    #   修复了打开,保存时候如果没有正确选择文件而导致的异常关闭,增加了退出时候的提醒。
    #   新建了一个默认保存软件图片的文件夹。在C盘下面的Magpic pictures。
    #   全面美化了界面,给背景、按钮都添加了背景图片。
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import *
    from PyQt5.QtCore import QCoreApplication
    # 打开/保存文件的对话框,需要这个包:
    from PyQt5.QtWidgets import QFileDialog
    import PIL
    from PIL import Image,ImageFilter,ImageFont,ImageDraw,ImageEnhance
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtGui import *
    import sys
    import os
    import argparse
    
    # 创建默认存放文件的文件夹:
    cur_dir="C:"
    folder_name='Magpic pictures'
    if os.path.isdir("C:/Magpic pictures"):
        print("Already exist!")
    else: os.mkdir(os.path.join(cur_dir, folder_name))
    
    # 为了字符画而创建的字符集,共70个字符。
    ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
    
    
    class Ui_MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.retranslateUi(self)
            self.setWindowTitle("Magpic——Magic Picture of special YOU!")
            self.setWindowIcon(QIcon("icon/logo.ico"))
            # 定义了一些图片,filename存放的是打开图片的文件名,newPic存放P图后的文件,
            # origPic存放一个初始化图片,这个先忽略吧。
            self.filename="pic\\bg.png"
            self.newPic="pic\\bg.png"
            self.origPic=Image.open("pic\\bg.png")
            self.origPic.save("pic\\tempPic.png")
            self.sliderPic=""
            self.if_sliderPic=False  #是否保存sliderPic
    
    #-----------------------窗口初始化函数:-------------------------------------------------------------
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(1280, 700)    # 本来是1440*900  这里换成1280*800
            MainWindow.setStyleSheet("background")
            self.centralWidget = QtWidgets.QWidget(MainWindow)
            self.centralWidget.setObjectName("centralWidget")
            self.verticalLayout = QtWidgets.QVBoxLayout(self.centralWidget)
            self.verticalLayout.setContentsMargins(11, 11, 11, 11)
            self.verticalLayout.setSpacing(0)
            self.verticalLayout.setObjectName("verticalLayout")
            self.widget = QtWidgets.QWidget(self.centralWidget)
            self.widget.setMinimumSize(QtCore.QSize(500, 500))  # 500,500
            self.widget.setStyleSheet("background-color:rgb(60,63,65);")
            self.widget.setObjectName("widget")
            self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
            self.horizontalLayout.setContentsMargins(11, 11, 11, 11)
            self.horizontalLayout.setSpacing(6)
            self.horizontalLayout.setObjectName("horizontalLayout")
    # 图片区域:
            self.picArea = QtWidgets.QWidget(self.widget)
            self.picArea.setEnabled(True)
            self.picArea.setMinimumSize(QtCore.QSize(300, 0))
            self.picArea.setStyleSheet("background-color:rgb(43,43,43);background-image:url(pic/bg.png);")
            self.picArea.setObjectName("picArea")
        # 放置图片的标签:
            self.picLabel = QtWidgets.QLabel(self.picArea)
            self.picLabel.setGeometry(QtCore.QRect(0, 0, 1005, 622))         # 这个就是图片的最大像素。
            self.picLabel.setObjectName("picLabel")
            self.horizontalLayout.addWidget(self.picArea)
            self.picLabel.setStyleSheet("background-color:red;color:red;vertical-align:super;")
    # 工具区域:
            self.toolArea = QtWidgets.QWidget(self.widget)
            self.toolArea.setMinimumSize(QtCore.QSize(250, 600))
            self.toolArea.setMaximumSize(QtCore.QSize(250, 800))
            self.toolArea.setStyleSheet("background-color:rgb(185,148,106);background-image:url(images/wood4.jpg);")
            self.toolArea.setObjectName("toolArea")
        # 工具栏:
            self.toolBox = QtWidgets.QToolBox(self.toolArea)
            self.toolBox.setGeometry(QtCore.QRect(0, 0, 251, 600))
            #!!!!!!!! 这里本来是741,因为有的屏幕分辨率比较低,这样下面的一些工具栏就显示不出来了。
            self.toolBox.setMinimumSize(QtCore.QSize(0, 0))
            self.toolBox.setObjectName("toolBox")
            self.toolBox.setStyleSheet("font:bold;font-family:微软雅黑;font-size:16px;")
          # 工具栏第一页(菜鸟页):
            self.page1 = QtWidgets.QWidget()
            self.page1.setGeometry(QtCore.QRect(0, 0, 251, 581))
            self.page1.setObjectName("page1")
            # 放大按钮:
            self.bigger_Button = QtWidgets.QPushButton(self.page1)
            self.bigger_Button.setGeometry(QtCore.QRect(40, 15, 52, 52))
            self.bigger_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/plus1.png);")
            self.bigger_Button.setObjectName("bigger_Button")
            self.bigger_Button.clicked.connect(self.bigger)         #  bigger的信息槽
            # 缩小按钮:
            self.smaller_Button = QtWidgets.QPushButton(self.page1)
            self.smaller_Button.setGeometry(QtCore.QRect(160, 15, 52, 52))
            self.smaller_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/minus1.png);")
            self.smaller_Button.setObjectName("smaller_Button")
            self.smaller_Button.clicked.connect(self.smaller)     # samller 的信息槽
            # 旋转按钮:
            self.rotate_Button = QtWidgets.QPushButton(self.page1)
            self.rotate_Button.setGeometry(QtCore.QRect(60, 95, 141, 51))
            self.rotate_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_01.png);",)         # 添加了背景图片!
    
            self.rotate_Button.setObjectName("rotate_Button")
            self.rotate_Button.clicked.connect(self.rotatePic)               ## 信息槽
            # 上下翻转:top-bottom
            self.TB_Button = QtWidgets.QPushButton(self.page1)
            self.TB_Button.setGeometry(QtCore.QRect(60, 150, 141, 51))
            self.TB_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_02.png)")
            self.TB_Button.setObjectName("TB_Button")
            self.TB_Button.clicked.connect(self.TBPic)               ## 信息槽
            # 左右翻转:left-fight
            self.LR_Button = QtWidgets.QPushButton(self.page1)
            self.LR_Button.setGeometry(QtCore.QRect(60, 205, 141, 51))
            self.LR_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_07.png)")
            self.LR_Button.setObjectName("LR_Button")
            self.LR_Button.clicked.connect(self.LRPic)                 ## 信息槽
            # 拼接按钮:
            self.together_Button = QtWidgets.QPushButton(self.page1)
            self.together_Button.setGeometry(QtCore.QRect(60, 270, 141, 51))
            self.together_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_04.png)")
            self.together_Button.setObjectName("together_Button")
            self.together_Button.clicked.connect(self.together)             ## 拼接的信息-槽
            # 剪切按钮:
            self.cut_Button = QtWidgets.QPushButton(self.page1)
            self.cut_Button.setGeometry(QtCore.QRect(60, 325, 141, 51))
            self.cut_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_05.png)")
            self.cut_Button.setObjectName("cut_Button")
    
             # 局部消除(去水印)按钮:
            self.addSig_Button = QtWidgets.QPushButton(self.page1)
            self.addSig_Button.setGeometry(QtCore.QRect(60, 380, 141, 51))
            self.addSig_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/button_06.png)")
            self.addSig_Button.setObjectName("addSig_Button")
            self.addSig_Button.clicked.connect(self.add)             ## 信息槽
            self.toolBox.addItem(self.page1, "")
          # 工具栏第二页(进阶页):
            self.page2 = QtWidgets.QWidget()
            self.page2.setGeometry(QtCore.QRect(0, 0, 251, 581))
            self.page2.setObjectName("page2")
            # 模糊化滑动条:
            self.blur_Slider = QtWidgets.QSlider(self.page2)
            self.blur_Slider.setGeometry(QtCore.QRect(20, 20, 211, 22))
            self.blur_Slider.setOrientation(QtCore.Qt.Horizontal)
            self.blur_Slider.setObjectName("blur_Slider")
            self.blur_Slider.setMinimum(0)
            self.blur_Slider.setMaximum(50)
            self.blur_Slider.valueChanged.connect(self.MagicBarPic)  # 模糊化的信号-槽
    
            # 锐化滑动条:
            self.sharpen_Slider = QtWidgets.QSlider(self.page2)
            self.sharpen_Slider.setGeometry(QtCore.QRect(20, 100, 211, 22))
            self.sharpen_Slider.setOrientation(QtCore.Qt.Horizontal)
            self.sharpen_Slider.setObjectName("sharpen_Slider")
            self.sharpen_Slider.valueChanged.connect(self.MagicBarPic)  # 锐化的信号-槽
            # 油画滑动条:
            self.oil_Slider = QtWidgets.QSlider(self.page2)
            self.oil_Slider.setGeometry(QtCore.QRect(20, 180, 211, 22))
            self.oil_Slider.setOrientation(QtCore.Qt.Horizontal)
            self.oil_Slider.setObjectName("oil_Slider")
            self.oil_Slider.setMinimum(0)
            self.oil_Slider.setMaximum(30)
            self.oil_Slider.valueChanged.connect(self.MagicBarPic)  # 油画的信号-槽
            # 七彩 滑动条:
            self.colorful_Slider = QtWidgets.QSlider(self.page2)
            self.colorful_Slider.setGeometry(QtCore.QRect(20, 260, 211, 22))
            self.colorful_Slider.setOrientation(QtCore.Qt.Horizontal)
            self.colorful_Slider.setObjectName("colorful_Slider")
            self.colorful_Slider.setMinimum(0)
            self.colorful_Slider.setMaximum(44)
            self.colorful_Slider.valueChanged.connect(self.MagicBarPic)  # 油画的信号-槽
            # 下面这些分别是这些滑动条的标签:
            self.blur_label = QtWidgets.QLabel(self.page2)
            self.blur_label.setGeometry(QtCore.QRect(50, 35, 151, 31))
            self.blur_label.setStyleSheet("margin:0 auto;\n"
    "font:bold;\n"
    "font-family:微软雅黑;")
            self.blur_label.setObjectName("blur_label")
            self.sharpen_label = QtWidgets.QLabel(self.page2)
            self.sharpen_label.setGeometry(QtCore.QRect(60, 115, 131, 31))
            self.sharpen_label.setStyleSheet("margin:0 auto;\n"
    "font:bold;\n"
    "font-family:微软雅黑;")
            self.sharpen_label.setObjectName("sharpen_label")
            self.oil_label = QtWidgets.QLabel(self.page2)
            self.oil_label.setGeometry(QtCore.QRect(60, 195, 121, 31))
            self.oil_label.setStyleSheet("margin:0 auto;\n"
    "font:bold;\n"
    "font-family:微软雅黑;")
            self.oil_label.setObjectName("oil_label")
            self.colorful_label = QtWidgets.QLabel(self.page2)
            self.colorful_label.setGeometry(QtCore.QRect(60, 275, 121, 31))
            self.colorful_label.setStyleSheet("margin:0 auto;\n"
                                         "font:bold;\n"
                                         "font-family:微软雅黑;")
            self.colorful_label.setObjectName("colorful_label")
            # 保存模糊、锐化、油画按钮:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            self.saveSlider_Button = QtWidgets.QPushButton(self.page2)
            self.saveSlider_Button.setGeometry(QtCore.QRect(60, 310, 141, 51))
            self.saveSlider_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:red;")
            self.saveSlider_Button.setObjectName("saveSlider_Button")
            self.saveSlider_Button.clicked.connect(self.saveSlider)    #保存模糊、锐化、油画按钮:!!!!!!!!
    
            self.toolBox.addItem(self.page2, "")
          # 工具栏第三页(我是逗逼页):
            self.page3 = QtWidgets.QWidget()
            self.page3.setObjectName("page3")
    
    
            # 融合按钮:
            self.blend_Button = QtWidgets.QPushButton(self.page3)
            self.blend_Button.setGeometry(QtCore.QRect(30, 15, 191, 51))
            self.blend_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/bigger_button_7.png)")
            self.blend_Button.setObjectName("blend_Button")
            self.blend_Button.clicked.connect(self.blend)
            # 生成字符画按钮:
            self.charPic_Button = QtWidgets.QPushButton(self.page3)
            self.charPic_Button.setGeometry(QtCore.QRect(30, 70, 191, 51))
            self.charPic_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/bigger_button_8.png)")
            self.charPic_Button.setObjectName("charPic_Button")
            self.charPic_Button.clicked.connect(self.createCodePic)   # 生成字符画的信息-槽
            # 生成表情包按钮:
            self.emoji_Button = QtWidgets.QPushButton(self.page3)
            self.emoji_Button.setGeometry(QtCore.QRect(30, 125, 191, 51))
            self.emoji_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/bigger_button_9.png)")
            self.emoji_Button.setObjectName("emoji_Button")
            self.emoji_Button.clicked.connect(self.emoji)               ## 信息槽
            # 计算脸缘(相似度)按钮:
            self.similar_Button = QtWidgets.QPushButton(self.page3)
            self.similar_Button.setGeometry(QtCore.QRect(30, 180, 191, 51))
            self.similar_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/bigger_button_1.png)")
            self.similar_Button.setObjectName("similar_Button")
            self.similar_Button.clicked.connect(self.compare)                ## 信息槽
            # 变形按钮:
            self.shape_Button = QtWidgets.QPushButton(self.page3)
            self.shape_Button.setGeometry(QtCore.QRect(30, 235, 191, 51))
            self.shape_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/bigger_button_2.png)")
            self.shape_Button.setObjectName("shape_Button")
            # self.shape_Button.clicked.connect(self.add)            ## 信息槽
            self.toolBox.addItem(self.page3, "")
          # 工具栏第四页(滤镜页):
            self.page4 = QtWidgets.QWidget()
            self.page4.setObjectName("page4")
            # 添加一个说明标签:
            self.notice_label = QtWidgets.QLabel(self.page4)
            self.notice_label.setGeometry(QtCore.QRect(0, 5, 250, 100))
            self.notice_label.setStyleSheet("margin:0 auto;\n"
                                          "font:bold;\n"
                                          "font-family:微软雅黑;\n"
                                            "color:red;\n"
                                             "font-size:14px\n"
                                            )
            self.notice_label.setObjectName("blur_label")
    
            # 黑色钢笔按钮:
            self.bnw_Button = QtWidgets.QPushButton(self.page4)
            self.bnw_Button.setGeometry(QtCore.QRect(30, 115, 191, 51))
            self.bnw_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/pen.png);border:4px solid black;border-radius:5%")
            self.bnw_Button.setObjectName("bnw_Button")
            self.bnw_Button.clicked.connect(self.bnwPic)             ##黑白照片 的信息-槽
            # 显示轮廓
            self.contour_Button = QtWidgets.QPushButton(self.page4)
            self.contour_Button.setGeometry(QtCore.QRect(30, 170, 191, 51))
            self.contour_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/lunkuo.png);border:4px solid rgb(147,130,114);border-radius:5%")
            self.contour_Button.setObjectName("contour_Button")
            self.contour_Button.clicked.connect(self.contourPic)                ##轮廓 的信息-槽
            # 浮雕:
            self.emboss_Button = QtWidgets.QPushButton(self.page4)
            self.emboss_Button.setGeometry(QtCore.QRect(30, 225, 191, 51))
            self.emboss_Button.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/emboss.png);border:4px solid rgb(32,32,32);border-radius:5%;")
            self.emboss_Button.setObjectName("emboss_Button")
            self.emboss_Button.clicked.connect(self.embossPic)          ## 浮雕 的信息-槽
            # 熔岩魔鬼 按钮:
            self.fireGoast_pushButton = QtWidgets.QPushButton(self.page4)
            self.fireGoast_pushButton.setGeometry(QtCore.QRect(30, 280, 191, 51))
            self.fireGoast_pushButton.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;background-color:transparent;background-image:url(images/rongyan.png);border:4px solid rgb(146,14,14);border-radius:5%;color:orange")
            self.fireGoast_pushButton.setObjectName("fireGoast_pushButton")
            self.fireGoast_pushButton.clicked.connect(self.fireGoastPic)   ## 熔岩魔鬼 的信息-槽
            self.picArea.raise_()
            self.bnw_Button.raise_()
            self.contour_Button.raise_()
            self.emboss_Button.raise_()
            self.fireGoast_pushButton.raise_()
            self.toolBox.addItem(self.page4, "")
            self.horizontalLayout.addWidget(self.toolArea)
            self.verticalLayout.addWidget(self.widget)
        #窗口底部footer:
            self.footer = QtWidgets.QWidget(self.centralWidget)
            self.footer.setMaximumSize(QtCore.QSize(1280, 100))
            self.footer.setMinimumSize(QtCore.QSize(200, 32))
            self.footer.setStyleSheet("background-color:transparent;background-image:url(images/wood4.jpg)") # 底部的样式
            self.footer.setObjectName("footer")
          # 底部有5个标签:footerLabel1--footerLabel5,
          # 还有三个显示时、分、秒的数字屏lcdH、lcdM、lcdS:
            self.footerLabel1 = QtWidgets.QLabel(self.footer)
            self.footerLabel1.setGeometry(QtCore.QRect(100, 10, 251, 31))
            self.footerLabel1.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;\n"
    "color:darkblue;")
            self.footerLabel1.setObjectName("footerLabel1")
            self.lcdH = QtWidgets.QLCDNumber(self.footer)
            self.lcdH.setGeometry(QtCore.QRect(340, 2, 71, 51))
            self.lcdH.setObjectName("lcdH")
            self.footerLabel2 = QtWidgets.QLabel(self.footer)
            self.footerLabel2.setGeometry(QtCore.QRect(430, 11, 31, 31))
            self.footerLabel2.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;\n"
    "color:darkblue;")
            self.footerLabel2.setObjectName("footerLabel2")
            self.lcdM = QtWidgets.QLCDNumber(self.footer)
            self.lcdM.setGeometry(QtCore.QRect(460, 1, 71, 51))
            self.lcdM.setObjectName("lcdM")
            self.footerLabel3 = QtWidgets.QLabel(self.footer)
            self.footerLabel3.setGeometry(QtCore.QRect(550, 10, 31, 31))
            self.footerLabel3.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;\n"
    "color:darkblue;")
            self.footerLabel3.setObjectName("footerLabel3")
            self.lcdS = QtWidgets.QLCDNumber(self.footer)
            self.lcdS.setGeometry(QtCore.QRect(580, 1, 71, 51))
            self.lcdS.setObjectName("lcdS")
            self.footerLabel4 = QtWidgets.QLabel(self.footer)
            self.footerLabel4.setGeometry(QtCore.QRect(670, 10, 31, 31))
            self.footerLabel4.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;\n"
    "color:darkblue;")
            self.footerLabel4.setObjectName("footerLabel4")
            self.footerLabel5 = QtWidgets.QLabel(self.footer)
            self.footerLabel5.setGeometry(QtCore.QRect(700, 10, 251, 31))
            self.footerLabel5.setStyleSheet("font:bold;\n"
    "font-family:微软雅黑;\n"
    "color:darkblue;")
            self.footerLabel5.setObjectName("footerLabel5")
            self.verticalLayout.addWidget(self.footer)
            MainWindow.setCentralWidget(self.centralWidget)
    
        # 菜单栏:
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 1280, 36))
            self.menuBar.setStyleSheet("background-color:rgb(185,148,106);background-image:url(images/wood4.jpg);font-size:16px;font-family:微软雅黑;")
            self.menuBar.setObjectName("menuBar")
          # 文件菜单:
            self.menuFile = QtWidgets.QMenu(self.menuBar)
            self.menuFile.setObjectName("menuFile")
            self.menuFile.setStyleSheet("")
          # 帮助菜单:
            self.menuHelp = QtWidgets.QMenu(self.menuBar)
            self.menuHelp.setObjectName("menuHelp")
          # 分享菜单:
            self.menuShare = QtWidgets.QMenu(self.menuBar)
            self.menuShare.setObjectName("menuShare")
            MainWindow.setMenuBar(self.menuBar)
            # 说明书动作:
            self.actionGuide = QtWidgets.QAction(MainWindow)
            self.actionGuide.setObjectName("actionGuide")
            # 联系我们动作:
            self.actionContact = QtWidgets.QAction(MainWindow)
            self.actionContact.setObjectName("actionContact")
            # 分享到微信和QQ的动作:
            self.actionWeChat = QtWidgets.QAction(MainWindow)
            self.actionWeChat.setObjectName("actionWeChat")
            self.actionQQ = QtWidgets.QAction(MainWindow)
            self.actionQQ.setObjectName("actionQQ")
            # 打开文件动作:
            self.actionOpen = QtWidgets.QAction(MainWindow)
            self.actionOpen.setObjectName("actionOpen")
            self.actionOpen.triggered.connect(self.openPic) ## 打开图片的信息-槽
            # 保存文件动作:
            self.actionSave = QtWidgets.QAction(MainWindow)
            self.actionSave.setObjectName("actionSave")
            self.actionSave.triggered.connect(self.savePic) ## 保存图片的信息-槽
            # 退出动作:
            self.actionQuit = QtWidgets.QAction(MainWindow)
            self.actionQuit.setObjectName("actionQuit")
            self.actionQuit.triggered.connect(QCoreApplication.quit)
    
    
            self.menuFile.addAction(self.actionOpen)
            self.menuFile.addAction(self.actionSave)
            self.menuFile.addSeparator()
            self.menuFile.addAction(self.actionQuit)
            self.menuHelp.addAction(self.actionGuide)
            self.menuHelp.addAction(self.actionContact)
            self.menuShare.addAction(self.actionWeChat)
            self.menuShare.addAction(self.actionQQ)
            self.menuBar.addAction(self.menuFile.menuAction())
            self.menuBar.addAction(self.menuHelp.menuAction())
            self.menuBar.addAction(self.menuShare.menuAction())
    
            self.retranslateUi(MainWindow)
            self.toolBox.setCurrentIndex(0)  # 设置最开始显示的工具栏
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    #——————————————组件翻译函数:——————————————————————————————
        def retranslateUi(self, MainWindow): # 这个函数好像是专门给组件命名的。
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.picLabel.setText(_translate("MainWindow", " "))
            # 在这里设置初始的背景图片:
            # 这个如果放在前面(定义标签的时候),就显示不出来了。
            self.pic=QtGui.QPixmap("pic\\bg.png")
            self.picLabel.setPixmap(self.pic)
    
            self.bigger_Button.setText(_translate("MainWindow", " "))   #大
            self.smaller_Button.setText(_translate("MainWindow", " "))   #小
            self.rotate_Button.setText(_translate("MainWindow", "旋转吧♋"))
            self.TB_Button.setText(_translate("MainWindow", "翻跟头♓"))
            self.LR_Button.setText(_translate("MainWindow", "照镜子¤"))
            self.together_Button.setText(_translate("MainWindow", "|+|拼接"))
            self.cut_Button.setText(_translate("MainWindow", "剪切✄"))
            self.toolBox.setItemText(self.toolBox.indexOf(self.page1), _translate("MainWindow", "基本处理"))
            self.blur_label.setText(_translate("MainWindow", "模糊化"))
            self.sharpen_label.setText(_translate("MainWindow", "锐化"))
            self.oil_label.setText(_translate("MainWindow", "油画"))
            self.colorful_label.setText(_translate("MainWindow", "~七彩~"))
            self.saveSlider_Button.setText(_translate("MainWindow", "保存以上修改"))
            self.addSig_Button.setText(_translate("MainWindow", "个性签名※"))
            self.toolBox.setItemText(self.toolBox.indexOf(self.page2), _translate("MainWindow", "超级魔法棒"))
    
            self.blend_Button.setText(_translate("MainWindow", "@_@图片融合术"))
            self.charPic_Button.setText(_translate("MainWindow", "->#生成字符画"))
            self.emoji_Button.setText(_translate("MainWindow", "⊙o⊙制作表情包"))
            self.similar_Button.setText(_translate("MainWindow", "♥o♥我爱算脸缘"))
            self.shape_Button.setText(_translate("MainWindow", ">_<????"))
            self.toolBox.setItemText(self.toolBox.indexOf(self.page3), _translate("MainWindow", "我是逗逼"))
    
            self.notice_label.setText(_translate("MainWindow", "丑话在先:\n魔力太强大,不能恢复!\n建议每个效果只使用1次"))
            self.bnw_Button.setText(_translate("MainWindow", "黑色钢笔■"))
            self.contour_Button.setText(_translate("MainWindow", "轮廓印象░"))
            self.emboss_Button.setText(_translate("MainWindow", "浮你的雕▣"))
            self.fireGoast_pushButton.setText(_translate("MainWindow", "熔岩魔鬼☹"))
            self.toolBox.setItemText(self.toolBox.indexOf(self.page4), _translate("MainWindow", "潘多拉魔盒"))
            self.footerLabel1.setText(_translate("MainWindow", "您已经在Magpic浪费了"))
            self.footerLabel2.setText(_translate("MainWindow", "时"))
            self.footerLabel3.setText(_translate("MainWindow", "分"))
            self.footerLabel4.setText(_translate("MainWindow", "秒"))
            self.footerLabel5.setText(_translate("MainWindow", "的美好时光~O(∩_∩)O~"))
            self.menuFile.setTitle(_translate("MainWindow", "文件"))
            self.menuHelp.setTitle(_translate("MainWindow", "帮助"))
            self.menuShare.setTitle(_translate("MainWindow", "分享"))
            self.actionGuide.setText(_translate("MainWindow", "说明书"))
            self.actionContact.setText(_translate("MainWindow", "撩我们"))
            self.actionWeChat.setText(_translate("MainWindow", "分享到微信"))
            self.actionQQ.setText(_translate("MainWindow", "分享到QQ"))
            self.actionOpen.setText(_translate("MainWindow", "打开"))
            self.actionSave.setText(_translate("MainWindow", "保存"))
            self.actionQuit.setText(_translate("MainWindow", "强行退出"))
    
    
    #———————————功能函数区:——————————————————————————
    ##打开和保存:
        def openPic(self):
            #初始化slider的值:
            self.blur_Slider.setValue(0)
            self.sharpen_Slider.setValue(0)
            self.colorful_Slider.setValue(0)
            self.oil_Slider.setValue(0)
    
            address=QFileDialog.getOpenFileName(self,"亲,选取一张图片哦!","F:\视频·图片\图片!!!\上财照片","Image files(*.png *.jpg *.jpeg *.gif);;all files(*.*)")
            self.filename=address[0]     # 这个address是一个列表,所以需要取第一项
            if self.filename:
                print(self.filename)
                # 把这个图片显示在画面上:
                self.pic=QtGui.QPixmap(self.filename)
                self.picLabel.setPixmap(self.pic)
                self.newPic=Image.open(self.filename)
                # # 要把新打开的图片,和所有修改过的图片,都存进tempPic.jpg里面,作为一个中间变量。
                self.newPic.save("pic\\tempPic.png")
                self.newPic="pic\\tempPic.png"
    
    
    
        def savePic(self):
            print("1")
            saveAddress=QFileDialog.getSaveFileName(self,"保存文件","C:/Magpic pictures","Image files(*.png *.jpg *.jpeg *.gif);;all files(*.*)")
            print("2")
            if saveAddress[0]:
                self.newPic=Image.open("pic\\tempPic.png")   # 注意,每一次open,都把newPic重新赋值了。
                self.newPic.save(saveAddress[0])  # 保存新图片newPic
                self.newPic="pic\\tempPic.png"
                print("3")
                print(saveAddress[0],"已经保存成功!")
    # 退出警告:
        def closeEvent(self, event):  # 这个closeEvent是父类的方法,这里把它重写了一下!
            reply = QMessageBox.question(self, "Waring", "<b><font color=red>嘿!你真的就这么走了吗?</font></b>",
                                         QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if reply == QMessageBox.Yes:
                event.accept()
            if reply == QMessageBox.No:
                event.ignore()
    
    
    
    
    ## 模糊化:
        def MagicBarPic(self):
            # 首先获取原始图片:
            # getPic=Image.open(self.filename)
            getPic=Image.open(self.newPic)
            blur_radiusValue=self.blur_Slider.value()  # 参数的值
            sharpen_radiusValue=self.sharpen_Slider.value()
            oil_sizeValue=self.oil_Slider.value()
            alpha=self.colorful_Slider.value()
    
            # 对图片进行处理,形成新图片:
            self.newPic=getPic.filter(ImageFilter.GaussianBlur(radius=blur_radiusValue))   #模糊化
            self.newPic.save("pic\\sliderPic.png") #如果没有这一步,上面的效果会被下面的直接覆盖掉。
            self.newPic=self.newPic.filter(ImageFilter.UnsharpMask(radius=sharpen_radiusValue,percent=300,threshold=3))   # 锐化
            self.newPic.save("pic\\sliderPic.png")
            self.newPic=self.newPic.filter(ImageFilter.ModeFilter(size=oil_sizeValue))   # 油画
            # 处理完之后,保存为tempPic.jpg:
            self.newPic.save("pic\\sliderPic.png")
    
            # 七彩处理————
            size = self.newPic.size
            colorfulPic = Image.new('RGB', size)
            p_pic = self.newPic.load()
            p_colorfulPic = colorfulPic.load()
            # ——————————
    
            # 七彩处理:————
    #         alpha = 0  # 0~44
            for i in range(size[0]):
                for j in range(size[1]):
                    if alpha == 0:
                        p_colorfulPic[i, j] = p_pic[i, j]
                    elif p_pic[i, j][0] < alpha and p_pic[i, j][1] < alpha and p_pic[i, j][2] < alpha:
                        p_colorfulPic[i, j] = (155, 7, 129)
                    elif p_pic[i, j][0] < alpha * 2 and p_pic[i, j][1] < alpha * 2 and p_pic[i, j][2] < alpha * 2:
                        p_colorfulPic[i, j] = (29, 32, 137)
                    elif p_pic[i, j][0] < alpha * 3 and p_pic[i, j][1] < alpha * 3 and p_pic[i, j][2] < alpha * 3:
                        p_colorfulPic[i, j] = (0, 142, 216)
                    elif p_pic[i, j][0] < alpha * 4 and p_pic[i, j][1] < alpha * 4 and p_pic[i, j][2] < alpha * 4:
                        p_colorfulPic[i, j] = (12, 165, 62)
                    elif p_pic[i, j][0] < alpha * 5 and p_pic[i, j][1] < alpha * 5 and p_pic[i, j][2] < alpha * 5:
                        p_colorfulPic[i, j] = (255, 228, 1)
                    elif p_pic[i, j][0] < 225 and p_pic[i, j][1] < (255 - alpha * 5) - 25 and p_pic[i, j][2] < (
                        255 - alpha * 5) - 25:
                        p_colorfulPic[i, j] = (242, 146, 0)
                    else:
                        p_colorfulPic[i, j] = (230, 0, 19)
            colorfulPic.save("pic\\sliderPic.png")
    # ——————————
            self.newPic="pic\\tempPic.png"  #!!!!!!!!!!不能写sliderPic,因为每一次点击,都会打开一个新的newPic,如果把newPic存放成了sliderPic.png,那么下次打开的时候效果还是会累加无法复原。
            # 在画面上展示一下效果:
            self.pic=QtGui.QPixmap("pic\\sliderPic.png")
            self.picLabel.setPixmap(self.pic)
    
        def saveSlider(self):
            sliderPic=Image.open("pic\\sliderPic.png")
            sliderPic.save("pic\\tempPic.png")
            self.newPic="pic\\tempPic.png"
    
    
    # 各种旋转:
        def rotatePic(self):
            print(self.newPic)
            getPic=Image.open(self.newPic)
            self.newPic=getPic.transpose(PIL.Image.ROTATE_90)
            self.newPic.save("pic\\tempPic.png")   # !!!!注意,这里虽然newPic保存成tempPic,但是newPic的值却不等于这个地址。在上一步的时候,newPic的值被替换成了一个中间格式。
            # print(self.newPic) # 这里可以看出,此时newPic的值并不是tempPic.png,需要下一步:
            self.newPic="pic\\tempPic.png"
            self.pic=QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
        def TBPic(self):
            print(self.newPic)
            getPic=Image.open(self.newPic)
            self.newPic=getPic.transpose(PIL.Image.FLIP_TOP_BOTTOM)
            self.newPic.save("pic\\tempPic.png")   # 注意,这里虽然newPic保存成tempPic,但是newPic的值却不等于这个地址。在上一步的时候,newPic的值被替换成了一个中间格式。
            # print(self.newPic) # 这里可以看出,此时newPic的值并不是tempPic.png,需要下一步:
            self.newPic="pic\\tempPic.png"
            self.pic=QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
        def LRPic(self):
            print(self.newPic)
            getPic=Image.open(self.newPic)
            self.newPic=getPic.transpose(PIL.Image.FLIP_LEFT_RIGHT)
            self.newPic.save("pic\\tempPic.png")   # 注意,这里虽然newPic保存成tempPic,但是newPic的值却不等于这个地址。在上一步的时候,newPic的值被替换成了一个中间格式。
            # print(self.newPic) # 这里可以看出,此时newPic的值并不是tempPic.png,需要下一步:
            self.newPic="pic\\tempPic.png"
            self.pic=QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
    ## 拼接:
        def together(self):
            address=QFileDialog.getOpenFileNames(self,"请选择要拼接的图片(*^__^*)","C:/")
            if address[0]:
                num=len(address[0])  #因为这个address的第一项才存放的地址。
                print("有",num,"个文件被选出来了:")
    
                width=350
                height=350
                self.newPic=Image.new('RGB',(width*num,height))
                print("hhhhhhhhhhhhh")
                for i in range(num):
                    print(address[0][i])
                    oriPic=Image.open(address[0][i])       # 导入每一张图片
                    resizePic=oriPic.resize((width,height))
    
                    self.newPic.paste(resizePic,(i*width,0))
                print("1111111")
                self.newPic.save("pic\\tempPic.png")
                print("2222222")
                self.pic=QtGui.QPixmap("pic\\tempPic.png")
                print("3333333")
                self.picLabel.setPixmap(self.pic)
                print("44444444")
                self.newPic.resize((width*num,height)).save("pic\\tempPic.png")
                self.newPic="pic\\tempPic.png"
    
    
    ## 图片融合术:
        def blend(self):
            address=QFileDialog.getOpenFileNames(self,"请选择要拼接的图片(两张哦!)(*^__^*)","C:/")
            if address[0]:
                print("第一个文件是:",address[0][0])
                print("第二个文件是:",address[0][1])
                pic1=Image.open(address[0][0])
                pic2=Image.open(address[0][1])
                width=600
                height=600
                pic1=pic1.resize((width,height))
    
                pic2=pic2.resize((width, height))
                self.newPic=Image.blend(pic1.convert("RGBA"),pic2.convert("RGBA"),alpha=0.5)
    
                self.newPic.save("pic\\tempPic.png")
                print("2222222")
                self.pic=QtGui.QPixmap("pic\\tempPic.png")
                print("3333333")
                self.picLabel.setPixmap(self.pic)
                print("44444444")
                self.newPic="pic\\tempPic.png"
    
    
    ## 轮廓:
        def contourPic(self):
            print(self.newPic)
            getPic = Image.open(self.newPic)
            self.newPic = getPic.filter(ImageFilter.CONTOUR)
            self.newPic.save("pic\\tempPic.png")  # 注意,这里虽然newPic保存成tempPic,但是newPic的值却不等于这个地址。在上一步的时候,newPic的值被替换成了一个中间格式。
            # print(self.newPic) # 这里可以看出,此时newPic的值并不是tempPic.png,需要下一步:
            self.newPic = "pic\\tempPic.png"
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
    
    ## 浮雕:
        def embossPic(self):
            print(self.newPic)
            getPic = Image.open(self.newPic)
            self.newPic = getPic.filter(ImageFilter.EMBOSS)
            self.newPic.save("pic\\tempPic.png")  # 注意,这里虽然newPic保存成tempPic,但是newPic的值却不等于这个地址。在上一步的时候,newPic的值被替换成了一个中间格式。
            # print(self.newPic) # 这里可以看出,此时newPic的值并不是tempPic.png,需要下一步:
            self.newPic = "pic\\tempPic.png"
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
    ## 黑白:
        def bnwPic(self):
    
            self.newPic=Image.open("pic\\tempPic.png")
            size = self.newPic.size
            bnwPic = Image.new('RGB', size)
            p_pic = self.newPic.load()
            p_bnwPic = bnwPic.load()
    
            for i in range(size[0]):
                for j in range(size[1]):
                    # if p_pic[i, j][0] < 80 and p_pic[i, j][1] < 80 and p_pic[i, j][2] < 80:
                    #     p_bnwPic[i, j] = (0, 0, 0)
                    # elif p_pic[i, j][0] < 160 and p_pic[i, j][1] < 160 and p_pic[i, j][2] < 160:
                    #     p_bnwPic[i, j] = (220, 220, 220)
                    # else: p_bnwPic[i, j] = (255, 255, 255)  # 这种其实也可以,但是下面这个更加细致一些。
                    alpha=30
                    if p_pic[i, j][0] < alpha and p_pic[i, j][1] < alpha and p_pic[i, j][2] < alpha:
                        p_bnwPic[i, j] = (0,0,0)
                    elif p_pic[i, j][0] < alpha * 2 and p_pic[i, j][1] < alpha * 2 and p_pic[i, j][2] < alpha * 2:
                        p_bnwPic[i, j] = (10,10,10)
                    elif p_pic[i, j][0] < alpha * 3 and p_pic[i, j][1] < alpha * 3 and p_pic[i, j][2] < alpha * 3:
                        p_bnwPic[i, j] = (20,20,20)
                    elif p_pic[i, j][0] < alpha * 4 and p_pic[i, j][1] < alpha * 4 and p_pic[i, j][2] < alpha * 4:
                        p_bnwPic[i, j] = (180,180,180)
                    elif p_pic[i, j][0] < alpha * 5 and p_pic[i, j][1] < alpha * 5 and p_pic[i, j][2] < alpha * 5:
                        p_bnwPic[i, j] = (200,200,200)
                    elif p_pic[i, j][0] < 225 and p_pic[i, j][1] < (255 - alpha * 5) - 25 and p_pic[i, j][2] < (
                        255 - alpha * 5) - 25:
                        p_bnwPic[i, j] = (220,220,220)
                    else:
                        p_bnwPic[i, j] = (255,255,255)
            bnwPic.save("pic\\tempPic.png")
    
    
            self.newPic = "pic\\tempPic.png"
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
    # 熔岩魔鬼 :
        def fireGoastPic(self):
            self.newPic = Image.open("pic\\tempPic.png")
            size = self.newPic.size
            fireGoastPic = Image.new('RGB', size)
            p_pic = self.newPic.load()
            p_fireGoastPic = fireGoastPic.load()
    
            for i in range(size[0]):
                for j in range(size[1]):
                    p_fireGoastPic[i, j] = p_pic[i, j][2] * 9
            fireGoastPic.save("pic\\tempPic.png")
    
            self.newPic = "pic\\tempPic.png"
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
    
    
    # 生成字符画:
        def rgb_to_char(self,r, g, b, alpha=256):
            if alpha == 0:
                return ' '
            length = len(ascii_char)
            gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    
            unit = (256.0 + 1) / length
            return ascii_char[int(gray / unit)]
    
        def createCodePic(self):
            img = Image.open("pic/tempPic.png")
            img = img.resize((120, 120))
            size = img.size
            width = size[0]
            height = size[1]
            pimg = img.load()
    
            txt = ""
            for i in range(height):
                for j in range(width):
                    r = pimg[j, i][0]
                    g = pimg[j, i][1]
                    b = pimg[j, i][2]
                    print("1")
                    txt = txt + self.rgb_to_char(r, g, b, alpha=256)
                    print("1111")
                txt = txt + "\n"
            print("2")
            txtAddress = QFileDialog.getSaveFileName(self, "快!把你的字符画收好!", "C:/Magpic pictures",
                                                      "Image files(*.txt);;all files(*.*)")
            if txtAddress[0]:
                print("3")
                txtpic = open(txtAddress[0], "w")
                txtpic.write(txt)
                txtpic.close()
    
        def bigger(self):
            img = cv2.imread(self.newPic)
            res = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)
            cv2.imwrite("pic\\tempPic.png", res)
            # 在画面上展示一下效果:
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
            self.newPic = "pic\\tempPic.png"
    
        def smaller(self):
            img = cv2.imread(self.newPic)
            res = cv2.resize(img, None, fx=2/3, fy=2/3, interpolation=cv2.INTER_CUBIC)
            cv2.imwrite("pic\\tempPic.png", res)
            # 在画面上展示一下效果:
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
            self.newPic = "pic\\tempPic.png"
    
        def add(self):
            input=QInputDialog.getText(self, "请添加个性化水印!","水印:",QLineEdit.Normal, "Magpic")
            print(input[0])
            font = ImageFont.truetype("C:\\Windows\\Fonts\\Arial.ttf", 50)
    
            def add_text_to_image(image, text, font=font):
                rgba_image = image.convert('RGBA')
                text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))
                image_draw = ImageDraw.Draw(text_overlay)
    
                text_size_x, text_size_y = image_draw.textsize(text, font=font)
                # 设置文本文字位置
                print(rgba_image)
                text_xy = (rgba_image.size[0] - text_size_x, rgba_image.size[1] - text_size_y)
                # 设置文本颜色和透明度
                image_draw.text(text_xy, text, font=font, fill=(185,148,106, 800))
    
                image_with_text = Image.alpha_composite(rgba_image, text_overlay)
    
                return image_with_text
    
            im_before = Image.open(self.newPic)
            im_after = add_text_to_image(im_before, input[0])
            im_after.save("pic\\tempPic.png")
            # 在画面上展示一下效果:
            self.pic = QtGui.QPixmap("pic\\tempPic.png")
            self.picLabel.setPixmap(self.pic)
            self.newPic = "pic\\tempPic.png"
    
        def emoji(self):
            print("asdfdsfdfafdsfsadfasdfasdfsf")
            hhaddress = QFileDialog.getOpenFileName(self, "请选择一个头像(☆▽☆)", "C:/")
            print("13123213231")
            if hhaddress[0]:
                getPic = Image.open(hhaddress[0])
                print("hahahahah")
    
                getPic2 = Image.open("pic\\k3.png")
                box = (200, 150, 420, 450)
                # mycrop = getPic.crop(box)
                # mycrop = mycrop.transpose(Image.ROTATE_180)
                # getPic.paste(mycrop, box)
                print("11")
                imgenhancer_Brightness = ImageEnhance.Brightness(getPic)
                newPic1 = imgenhancer_Brightness.enhance(2)
                print("22")
                imgenhancer_Contrast = ImageEnhance.Contrast(newPic1)
                newPic1 = imgenhancer_Contrast.enhance(6)
                print("33")
                newPic2 = newPic1.convert("L")
                region = newPic2
                print("44")
                region = region.resize((box[2] - box[0], box[3] - box[1]))
                getPic2.paste(region, box)
                # 处理完之后,保存为tempPic.png:
                getPic2.save("pic\\tempPic.png")
                # 在画面上展示一下效果:
                self.pic = QtGui.QPixmap("pic\\tempPic.png")
                self.picLabel.setPixmap(self.pic)
                self.newPic = "pic\\tempPic.png"
    
        def compare(self):
            address = QFileDialog.getOpenFileNames(self, "请选择要比较的图片(*^__^*)", "C:/")
            if address[0]:
                num = len(address[0])  # 因为这个address的第一项才存放的地址。
                print("有", num, "个文件被选出来了:")
                pic1=address[0][0]
                pic2=address[0][1]
                print(pic1,pic2)
    
        # #————————————————————————————————————————————————————
                getPic = Image.open(pic1)
                getPic2 = Image.open(pic2)
    
                def make_regalur_image(img, size=(256, 256)):
                    return img.resize(size).convert('RGB')
    
                def split_image(img, part_size=(64, 64)):
                    w, h = img.size
                    pw, ph = part_size
    
                    assert w % pw == h % ph == 0
                    return [img.crop((i, j, i + pw, j + ph)).copy() \
                            for i in range(0, w, pw) \
                            for j in range(0, h, ph)]
    
                def hist_similar(lh, rh):
                    assert len(lh) == len(rh)
                    return sum(1 - (0 if l == r else float(abs(l - r)) / max(l, r)) for l, r in zip(lh, rh)) / len(lh)
    
                def calc_similar(li, ri):
                    return sum(
                        hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
    
                def calc_similar_by_path(lf, rf):
                    li, ri = lf, rf
                    return calc_similar(li, ri)
    
                self.com = calc_similar_by_path(make_regalur_image(getPic), make_regalur_image(getPic2))
                # print(self.com)
                print("2343321")
        #_________________________________________
                width = 350
                height = 350
                self.newPic = Image.new('RGB', (width * num, height))
                print("hhhhhhhhhhhhh")
                for i in range(num):
                    print(address[0][i])
                    oriPic = Image.open(address[0][i])  # 导入每一张图片
                    resizePic = oriPic.resize((width, height))
    
                    self.newPic.paste(resizePic, (i * width, 0))
                print("1111111")
                self.newPic.resize((1000,600)).save("pic\\tempPic.png")
                print("2222222")
                self.pic = QtGui.QPixmap("pic\\tempPic.png")
                print("3333333")
                self.picLabel.setPixmap(self.pic)
                print("44444444")
                self.newPic.save("pic\\tempPic.png")
                self.newPic = "pic\\tempPic.png"
                reply = QMessageBox.information(self, "相似度:", "<b><font color=red>两张图片的相似度是</font></b>"+str('%.2f'%(self.com*100))+"%",)
    
    
    
    # 显示相似度:
        def show_similarity(self, event):
            print("1")
            score=self.com
            print("2")
            reply = QMessageBox.question(self, "相似度:", "<b><font color=red>两张图片的相似度是</font></b>"+str(score),
                                         QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if reply == QMessageBox.Yes:
                event.accept()
            if reply == QMessageBox.No:
                event.ignore()
    
    
        #————————创建实例,展示窗口:——————————————————————————————
    qapp=QApplication(sys.argv)
    app=Ui_MainWindow()
    app.setStyleSheet('''
        QPushButton:hover{
        background-color:transparent;
        background-image:url(images/hover.png);}
        QMenu{
            font: bold 16px;
            }
        QPushButton{
        background-color:transparent;
        background-image:url(images/button_11.png);}
        font: bold 16px;
    
           ''')
    
    app.show()
    sys.exit(qapp.exec_())
    
    
    # self.rotate_Button.setStyleSheet("QPushButton:hover{background-color:transparent;background-image:url(images/button_02.png)}")
    
    

    代码中有明显的分割线,可以根据往期的教程的逻辑结构去理解。每个功能也有明显的提示,可以自己去看看怎么实现的。

    往期系列文章:

    PIL包的使用
    PyQt5的使用
    Qt Creator的使用
    ui文件转py文件

    相关文章

      网友评论

      • Symbian米汤:感谢,学习了
        Stack_empty:@Symbian米汤 谢谢!我这个写的还是太匆忙了,很多细节都来不及写。惭愧…

      本文标题:PyQt+PIL做P图软件(终结版【附完整代码】)

      本文链接:https://www.haomeiwen.com/subject/tqzmfftx.html