完整代码

#-*- coding: utf-8 -*-
"""
Created on Sat May  2 10:09:55 2020
@author: 久未
"""
import sys,win32ui,os
from PIL import Image,ImageQt,ImageDraw,ImageFont
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *class ps(QWidget):def __init__(self):"""界面初始化"""super(ps, self).__init__()self.UI_init()def UI_init(self):'''GUI板块设置'''#顶层窗口大小设置desktop = QApplication.desktop()screenRect = desktop.screenGeometry()win_height = screenRect.height()win_width = screenRect.width()self.resize(win_width,win_height)self.setWindowTitle('PS Made By 周逸彪')#交互区域设置#图片区设置x=0.9self.pic_label = QLabel(self)self.pic_label.setFixedSize(x*win_width,0.90*win_height)self.pic_label.move(0,0)# 0.1*win_heightself.pic_label.setStyleSheet("QLabel{background:none;}")self.pic_label.setFrameShape(QtWidgets.QFrame.Box)self.pic_label.setLineWidth(1)#按钮区背景,分为图片打开按钮,亮度调节按钮,缩放区,旋转区,加注水印区等self.back = QLabel(self)y=0.8self.back.setFixedSize(0.9*(1-x)*win_width,y*win_height)self.back.move(x*win_width+0.05*(1-x)*win_width,0.3*(1-y)*win_height)self.back.setStyleSheet("QLabel{background:none;}")# 开始:wlayout = QtWidgets.QVBoxLayout() # 按钮区全局布局hlayout1 = QtWidgets.QVBoxLayout() #按钮区局部布局,6个hlayout2 = QtWidgets.QVBoxLayout()glayout1 = QtWidgets.QGridLayout()glayout2 = QtWidgets.QGridLayout()hlayout3 = QtWidgets.QVBoxLayout()glayout3 = QtWidgets.QGridLayout()#细节self.打开图片 = QtWidgets.QPushButton("打开图片")self.打开图片.clicked.connect(self.openimage)self.还原 = QtWidgets.QPushButton("图片还原")self.还原.clicked.connect(self.goback)self.应用亮度 = QtWidgets.QPushButton('应用亮度')self.应用亮度.clicked.connect(self.briApply)self.目标亮度=QtWidgets.QLineEdit('目标亮度的倍数')self.目标亮度.setAlignment(Qt.AlignCenter)self.左旋 = QtWidgets.QPushButton('左旋')self.左旋.clicked.connect(self.rightorient)self.旋转度数=QtWidgets.QLabel('90度')self.旋转度数.setAlignment(Qt.AlignCenter)self.左右反转 = QtWidgets.QPushButton('左右翻转')self.左右反转.clicked.connect(self.hturnover)self.上下反转 = QtWidgets.QPushButton('上下翻转')self.上下反转.clicked.connect(self.vturnover)self.横向 = QtWidgets.QLabel('横向')self.纵向 = QtWidgets.QLabel('纵向')self.横向比例 = QtWidgets.QLineEdit('1')self.纵向比例 = QtWidgets.QLineEdit('1')self.应用缩放 = QtWidgets.QPushButton('应用缩放')self.应用缩放.clicked.connect(self.sfApply)self.纵向比例.setAlignment(Qt.AlignCenter)self.横向比例.setAlignment(Qt.AlignCenter)self.添加水印 = QtWidgets.QPushButton('添加水印')self.添加水印.clicked.connect(self.watermark)self.水印内容=QtWidgets.QLineEdit('水印内容')self.水印内容.setAlignment(Qt.AlignCenter)self.保存 = QtWidgets.QPushButton('点击保存')self.保存.clicked.connect(self.save)self.名称 = QtWidgets.QLineEdit('未命名')self.后缀 = QtWidgets.QLineEdit('.jpg')hlayout1.addWidget(self.打开图片)hlayout1.addWidget(self.还原) # 局部布局添加部件hlayout2.addWidget(self.应用亮度)hlayout2.addWidget(self.目标亮度)glayout1.addWidget(self.左旋,0,0,1,1)glayout1.addWidget(self.旋转度数,0,1,1,1)glayout1.addWidget(self.左右反转,1,0,1,1)glayout1.addWidget(self.上下反转,1,1,1,1)glayout2.addWidget(self.横向,0,0)glayout2.addWidget(self.纵向,0,1)glayout2.addWidget(self.横向比例,1,0)glayout2.addWidget(self.纵向比例,1,1)glayout2.addWidget(self.应用缩放,2,0,2,2)hlayout3.addWidget(self.添加水印)hlayout3.addWidget(self.水印内容)glayout3.addWidget(self.名称,0,0)glayout3.addWidget(self.后缀,0,1)glayout3.addWidget(self.保存,1,0,1,2)pic_open = QtWidgets.QWidget() # 准备五个部件bri = QtWidgets.QWidget()orien = QtWidgets.QWidget()sf = QtWidgets.QWidget()sy= QtWidgets.QWidget()save = QtWidgets.QWidget()pic_open.setLayout(hlayout1) # 五个部件设置局部布局bri.setLayout(hlayout2)orien.setLayout(glayout1)sf.setLayout(glayout2)sy.setLayout(hlayout3)save.setLayout(glayout3)wlayout.addWidget(pic_open) # 五个部件加至全局布局wlayout.addWidget(bri)wlayout.addWidget(orien)wlayout.addWidget(sf)wlayout.addWidget(sy)wlayout.addWidget(save)self.back.setLayout(wlayout) # 全局布局设置父级是back标签def openimage(self):"""打开图片"""dlg = win32ui.CreateFileDialog(1)  # 1表示打开文件对话框dlg.DoModal()self.filename=dlg.GetPathName()  # 获取选择的文件名称if self.filename.endswith('.jpg') or self.filename.endswith('.png'):#打开Image图片self.Img=Image.open(self.filename)self.bImage=self.Img.copy()self.bImage1=self.Img.copy()try:for orientation in ExifTags.TAGS.keys() : if ExifTags.TAGS[orientation]=='Orientation' : break exif=dict(self.Img._getexif().items())if exif[orientation] == 3 : self.Img=self.Img.rotate(180, expand = True)elif exif[orientation] == 6 : self.Img=self.Img.rotate(270, expand = True)elif exif[orientation] == 8 : self.Img=self.Img.rotate(90, expand = True)except:passself.pixshow()else:reply=QMessageBox.question(self,"文件打开失败","请选择jpg或者png类型文件",QMessageBox.Yes | QMessageBox.No)while reply==QMessageBox.No:reply=QMessageBox.question(self,"文件打开失败","请选择jpg或者png类型文件",QMessageBox.Yes | QMessageBox.No)def pixshow(self):'''将处理后的图片进行刷新'''# Image转QImageself.qim = ImageQt.ImageQt(self.Img)#Qimage转Qpixmapself.pix=QtGui.QPixmap.fromImage(self.qim).scaled(self.pic_label.width(), self.pic_label.height(),aspectRatioMode=Qt.KeepAspectRatio)self.pic_label.setAlignment(Qt.AlignCenter)self.pic_label.setPixmap(self.pix)def briApply(self):'''应用亮度'''text = self.目标亮度.text()self.Img=self.bImage.copy()try:if text=='目标亮度的倍数':t=1else:t = float(text)self.Img = self.Img.point(lambda p: p * t)except ValueError: reply=QMessageBox.question(self,"输入格式错误","请输入double类型",QMessageBox.Yes | QMessageBox.No)while reply==QMessageBox.No:reply=QMessageBox.question(self,"输入格式错误","请输入double类型",QMessageBox.Yes | QMessageBox.No)self.pixshow()def rightorient(self):'''顺时针旋转'''self.Img = self.Img.transpose(Image.ROTATE_90)self.bImage=self.Img.copy()self.pixshow()def hturnover(self):'''水平翻转'''self.Img=self.Img.transpose(Image.FLIP_LEFT_RIGHT)self.bImage=self.Img.copy()self.pixshow()def vturnover(self):'''上下颠倒'''self.Img=self.Img.transpose(Image.FLIP_TOP_BOTTOM)self.bImage=self.Img.copy()self.pixshow()def sfApply(self):'''图片缩放'''text1 = self.横向比例.text()text2 = self.纵向比例.text()self.Img=self.bImage.copy()try: t1 = float(text1)t2 = float(text2)w,h=self.Img.sizeself.Img = self.Img.resize((int(t1*w),int(t2*h)),Image.ANTIALIAS)except ValueError: reply=QMessageBox.question(self,"输入格式错误","请输入double类型",QMessageBox.Yes | QMessageBox.No)while reply==QMessageBox.No:reply=QMessageBox.question(self,"输入格式错误","请输入double类型",QMessageBox.Yes | QMessageBox.No)self.pixshow()def watermark(self):'''添加水印'''text = self.水印内容.text()self.Img=self.bImage.copy()try:if text=='水印内容':text='作者:周逸彪'ww,wh=self.Img.sizetextsize=wh//20draw = ImageDraw.Draw(self.Img)fontpath = "font/STXINGKA.TTF"font1 = ImageFont.truetype(fontpath,textsize)text_size_x, text_size_y = draw.textsize(text, font=font1)draw.text((ww-text_size_x,wh-text_size_y),text,'white',font=font1)except ValueError: passself.pixshow()def save(self):path=os.path.abspath('.')path=path.replace("\\","/")text1 = self.名称.text()text2 = self.后缀.text()if text2 in ['.jpg','.png']:self.Img.save(path+'/'+text1+text2)QMessageBox.information(self,"图片保存成功","图片保存成功!",QMessageBox.Yes | QMessageBox.No)else :reply=QMessageBox.question(self,"保存后缀错误","后缀从.jpg和.png中选择",QMessageBox.Yes | QMessageBox.No)while reply==QMessageBox.No:reply=QMessageBox.question(self,"保存后缀错误","后缀从.jpg和.png中选择",QMessageBox.Yes | QMessageBox.No)def goback(self):self.Img=self.bImage1.copy()self.pixshow()if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)my_ps = ps()my_ps.show()sys.exit(app.exec_())

效果图

简易Ps的Python实现相关推荐

  1. python自带gui_一个极简易上手的 Python GUI 库

    原标题:一个极简易上手的 Python GUI 库 很多同学学了 Python 之后都想开发带界面的程序,也就是 GUI 应用.一般用的比较多的 GUI 库是 Tkinter(Python 自带)和 ...

  2. cad和python哪个好学_对纯外行人来说,学习PS和Python哪个更容易?

    果真是高手大隐隐于市,我如此隐藏都被你看出来了,谢邀回答!然后你看出了吧!答案在我这里很明显,当然是学习ps更容易一点,至于Python我的天分实在是太渣,所以,至今我敢不敢承认我学过.既然都被召唤出 ...

  3. python矩形碰撞检测算法_简易夺旗游戏(python像素级碰撞检测之颜色碰撞)

    以下是部分代码预览: """ 简易夺旗游戏(python像素级碰撞检测之颜色碰撞) 按上下左右方向箭头操作小虫子去碰到小旗子,游戏就胜利了, 否则如果碰到黑色,游戏就失败 ...

  4. 简易画图工具(Python)

    简易画图工具(Python) 小黑最近在努力的入门python,正好学习到了Python的tkinker模块下的Canvas(画布)和Button(按钮)再加上相应的事务管理,实现了一个简单的画图小工 ...

  5. 20行Python代码制作简易PS工具,实现批量抠图

    你是否曾经想将某张照片中的人物抠出来,然后拼接到其他图片上去,从而可以即使你在天涯海角,我也可以到此一游? 专业点的人使用 PhotoShop 的"魔棒"工具可以抠图,非专业人士可 ...

  6. 安装好Pycharm后如何配置Python解释器简易教程(configure python interpreter)

    今天以配置Python解释器的问题给大家简单絮叨一下. 1.一般来说,当我们启动Pycharm,如果Pycharm正常激活的话,就会直接进入到Pycharm中去,并且Pycharm经常会弹出下图的界面 ...

  7. 简单的python画图代码_python opencv如何实现简易画图板 python opencv实现简易画图板代码...

    python opencv如何实现简易画图板?本篇文章小编给大家分享一下python opencv实现简易画图板代码,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 代码如下 ...

  8. 带得动ps和python的笔记本_配台电脑,能玩LOL顶配和能够写一些python脚本能用ps不卡,预算6k到8k?...

    qq58146078 回答数:43  |  被采纳数:86 2019-09-06 16:26:58 这里有个配置是LOL的抄下來(感谢原作者)因题主还要兼运行python(几乎没什么要求顺暢就行)和P ...

  9. Ps算法Python实现:图层混合模式-色相

    1.相关文章 最近想要实现Photoshop图层混合中的色相模式,在网上查阅了众多关于混合模式实现的文章: Photoshop图层混合模式详解 PS中混合模式是什么意思? photoshop图层混合模 ...

最新文章

  1. Mxnet TensorRT
  2. C# 3.0下有限状态机的一种优雅的实现
  3. java io 输出流_Java IO 输入和输出流
  4. i2c驱动 无法使用_Zephyr驱动SCCB设备
  5. 20201202 《计算感知》武老师 第2节课 笔记
  6. linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...
  7. Angr 初体验之探索口令
  8. oracle0数据库论文总结,大学oracle数据库总结(考试必备)
  9. appium+python+windows执行测试用例,并使用HTMLTestRunner输出测试报告
  10. opencv AKAZE 局部特征匹配算法
  11. 6年前的Dubbo,2年前的Spring Cloud,都被这个架构干掉了!
  12. Linux Storage I/O Stack v1.0
  13. ClickHouse数据导入(Flink、Spark、Kafka、MySQL、Hive)
  14. bcp导入到数据库_Bcp和链接到Azure的服务器
  15. w10自动删除文件怎么关了_绝地求生怎么删除新地图_删新沙漠地图文件办法
  16. 基于Matlab----RSSI指纹定位技术性能仿真
  17. Problem 1002-2017 ACM/ICPC Asia Regional Shenyang Online
  18. PLCrashReporter的使用
  19. 鸿蒙系统手机能用几年,华为鸿蒙系统何时能用到手机上?任正非:短时间做不到 重建生态需要几年时间...
  20. 遗传算法详解与MATLAB实现

热门文章

  1. Vue基础概念,基础指令,选项式API
  2. Web前端小白必看【网页开发工具/HTML常用标签】
  3. 拜托,面试官不要在问我Redis分布式锁原理了
  4. 如何在GitHub上传自己的项目(新手详细版)
  5. matlab工业产值增长率,已知今年的工业产值为100万元,产值增长率为从键盘输入......
  6. 读《世界因我而不同》
  7. Wince AlphaBlend
  8. 中国政府宣布境内销售的所有计算机必须预装绿色上网过滤软件
  9. 值得学习的品牌突围策略
  10. 软件工程和计算机科学与技术的区别在哪?