python实现p图软件_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.setWindowTitle("Magpic——Magic Picture of special YOU!")
self.setWindowIcon(QIcon("icon/logo.ico"))
# 定义了⼀些图⽚,filename存放的是打开图⽚的⽂件名,newPic存放P图后的⽂件,
# origPic存放⼀个初始化图⽚,这个先忽略吧。
self.filename="pic\\bg.png"
self.sliderPic=""
self.if_sliderPic=False #是否保存sliderPic
#-----------------------窗⼝初始化函数:-------------------------------------------------------------def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
self.verticalLayout = QtWidgets.alWidget)
self.verticalLayout.setContentsMargins(11, 11, 11, 11)
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.widget = QtWidgets.alWidget)
self.widget.setMinimumSize(QtCore.QSize(500, 500)) # 500,500
python菜鸟教程100self.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;")
# ⼯具区域:
# ⼯具栏:
# 这⾥本来是741,因为有的屏幕分辨率⽐较低,这样下⾯的⼀些⼯具栏就显⽰不出来了。
# ⼯具栏第⼀页(菜鸟页):
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_t(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_t(self.smaller) # samller 的信息槽
# 旋转按钮:
"font-family:微软雅⿊;background-color:transparent;background-image:url(images/button_01.png);",) # 添加了背景图⽚!ate_Button.setObjectName("rotate_Button")
# 上下翻转: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_t(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_t(self.LRPic) ## 信息槽
# 拼接按钮:
"font-family:微软雅⿊;background-color:transparent;background-image:url(images/button_04.png)")
# 剪切按钮:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论