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

时隔半年,我终于又有时间回到简书,接着写东西。主要是这半年时间都在忙着考研,以及忙其他的一些项目。后来某一天偶尔打开简书,发现十几条信息,很多人对这个“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文件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容