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

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, "相似度:", "两张图片的相似度是"+str('%.2f'%(self.com*100))+"%",)

# 显示相似度:

def show_similarity(self, event):

print("1")

score=self.com

print("2")

reply = QMessageBox.question(self, "相似度:", "两张图片的相似度是"+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)}")

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

往期系列文章:

python实现p图软件_PyQt+PIL做P图软件(终结版【附完整代码】)相关推荐

  1. Python数据可视化:2018年北上广深空气质量分析(附完整代码)

    ♚ 法纳斯特,Python爱好者,喜欢爬虫,数据分析以及可视化. 就在这周偶然看到一个学弟吐槽天津的空气,不禁想起那段厚德载雾,自强不吸的日子. 无图无真相,下图为证. 左边的图是去年2月份的时候,这 ...

  2. 用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 来源 | 01二进制(ID:gh_d1999add1857) 编辑 | Jane [导语]作者自称是一个 ...

  3. 用Python让蔡徐坤在我的命令行里打篮球!| 附完整代码

    作者自称是一个经常逛 B 站的肥宅.最近B站上流行的视频素材除了"换脸",其次就要属"蔡xx打球"视频了.有模仿的.对比的.手绘的... ...更过分的是,竟然 ...

  4. python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 来源 | 01二进制(ID:gh_d1999add1857) 编辑 | Jane [导语]作者自称是一个 ...

  5. Python:计算分位数、获取分位数的索引(自定义位置,附完整代码)

    最近写代码需要找数据的百分位数和其索引,但没找到合适的函数,就自己写了一个: 需要说明的是,这里对百分位数的定义为:一组n个观测值按照数值大小排列,处于p%位置的值称第p百分位数.(代码中的gapFr ...

  6. python代码手机壁纸_Python制作微信好友背景墙教程(附完整代码)

    引言 前段时间,微信朋友圈开始出现了一种晒照片新形式,微信好友墙,即在一张大图片中展示出自己的所有微信好友的头像. 效果如下图,出于隐私考虑,这里作了模糊处理. 是不是很炫,而且这还是独一无二的,毕竟 ...

  7. 用Python代码画一个足球(附完整代码)

    用Python代码画一个足球(附完整代码) C站举办了世界杯征文活动,本文用Python代码画一个足球. 实现方法介绍 本文的绘图工具使用Python的标准库turtle库,无需安装,导入即可使用. ...

  8. 吴恩达机器学习python实现(6):SVM支持向量机(文末附完整代码)

    所有的数据来源:链接:https://pan.baidu.com/s/1vTaw1n77xPPfKk23KEKARA 提取码:5gl2 1 Support Vector Machines 1.1 Pr ...

  9. Python实现自动翻译功能 - 附完整代码

    Python实现自动翻译功能 - 附完整代码 随着全球化的不断深入,越来越多的人需要跨越语言障碍进行交流.机器翻译技术的出现为这一问题提供了有效的解决方案.今天,我们将通过Python实现一个自动翻译 ...

最新文章

  1. matlab将x排序 y随之变化,在MATLAB中:XData和YData如何用更改的行数更新?
  2. 使用AspNet Core或纯静态HTML文件的跨平台桌面应用程序
  3. HDU-1520 Anniversary party(树形DP)
  4. 提高C#编程水平不可不读的50个要诀
  5. 拓端tecdat|stata具有异方差误差的区间回归
  6. 老男孩linux运维50期-谢江平
  7. android 常用软件包
  8. 无法安装64位版本的Office,因为在您的PC上找到了以下32位程序……解决办法
  9. 【数据分析】数据指标
  10. linux dd从磁盘读取文件命令
  11. 基于ssm 流浪猫狗救助系统
  12. 易快报创始人兼CEO马春荃:数智化时代扑面而来,多维度重构企业财智领域
  13. 数据分析系列 9/32 | Excel进行回归分析,预测真实值
  14. strcpy()、strncpy()函数
  15. Entity Framework Core 之Modeling Relationships
  16. 推荐3本Python高分书籍,居家旅行必备神器!
  17. ORB-SLAM3 单目惯导ros-system-track
  18. matlab中za是什么意思,MATLAB基础
  19. 《从0到1》读书摘要
  20. 小米手环7添加校园卡(门禁)

热门文章

  1. 8月VR大数据:Quest 2串流份额大幅下跌,疑似Steam统计出错
  2. 纵有疾风起,人生不言弃!外包两年程序员历经字节三面终于上岸,特来分享面经帮助大家
  3. 一名计算机专业渣渣的2019春招求职经历—(成功收割华为、浦发、新华三、宝信软件offer)
  4. 我也不知道问题出在哪
  5. X86 栈溢出原理与实现
  6. 使用Unity的SimViz解决方案模板快速启动自主仿真开发
  7. 工艺篇:常用表面处理
  8. HTTP常见的三种状态码(400 / 404 / 500)
  9. 中科蓝讯蓝牙: 编译环境安装_ToolChain及CodeBlock(IDE)的安装
  10. 舰船辐射噪声 matlab,基于MATLAB的舰船辐射噪声信号小波消噪处理