前提:
1、你要有python基础
2、你要了解pyqt5并熟练掌握信号与槽的关系
实现效果:
原代码1:
'''
author:michael
Size: 5.89 kB
Type: Python
Modified: 2021-01-06 下午 3:08
Created: 2021-01-05 下午 4:41
'''
from shutil import copyfile
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets
from picture import Ui_MainWindow
from PIL import Image
import sys
import os
class MainForm(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainForm, self).__init__()
self.setupUi(self)
self.setWindowTitle("图片压缩软件,作者:michael,制作日期:2021.01.06")
self.pushButton.clicked.connect(self.open_file)
self.pushButton_2.clicked.connect(self.get_size)
self.pushButton_3.clicked.connect(self.resize1)
self.pushButton_4.clicked.connect(self.compress)
def open_file(self):
fileName, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(),"*.jpg")
self.lineEdit.setText(fileName)
return fileName
def getlineEdittext(self):
return (self.lineEdit.text())
def getlineEdittext_3(self):
return (self.lineEdit_3.text())
def getlineEdittext_4(self):
return (self.lineEdit_4.text())
def get_size(self):
'''
获取图片文件的大小(KB)
--------------------
参数 fileName: 文件名
--------------------
返回 fileSize:文件的大小
'''
inImage=self.lineEdit.text()
if inImage=='':
QMessageBox.about(self, '提示','图片地址好像还没有选择哦!')
return
else:
inImage = self.lineEdit.text()
fileSize = os.path.getsize(f"{inImage}")
fileSize /= 1024 # 将单位转为KB
print(fileSize)
self.lineEdit_2.setText(str(fileSize))
return fileSize
def resize1(self):
'''
将图片调整为指定尺寸
----------------------------
参数 inImage:需要处理的图片地址
参数 width:预期图片宽度
参数 height:预期图片高度
参数 inplace:是否覆盖原文件
----------------------------
返回 outImage:压缩后的图片地址
'''
inImage = self.lineEdit.text()
if inImage=='':
QMessageBox.about(self, '提示','图片地址好像还没有选择哦!')
return
else:
inImage = self.lineEdit.text()
width = self.lineEdit_4.text()
if width =='':
QMessageBox.about(self, '提示','宽度好像还没填哦!')
return
else:
width=int(width)
height = self.lineEdit_3.text()
if height =='':
QMessageBox.about(self, '提示','高度好像还没填哦!')
return
else:
height=int(height)
if not self.checkBox.isChecked(): # 如果不覆盖
outImage = '%s-out.%s' % (inImage.split('.')[0], inImage.split('.')[1])
else:
outImage = inImage
image = Image.open(inImage)
image = image.resize((width, height))
image.save(outImage)
print('"%s"调整成功!(尺寸:%dx%d)' % (inImage, width, height))
QMessageBox.about(self, '提示','太棒了(*^▽^*),尺寸调整成功!')
return outImage
def compress(self):
'''
将图片压缩到指定的大小
-------------------------------
参数 inImage:需要处理的图片地址
参数 targetSize:预期压缩的大小
参数 step:每次迭代的压缩比
参数 quality:初始压缩比
参数 inplace:是否覆盖原文件
-------------------------------
返回 outImage:压缩后的图片地址
'''
quality = 100
inImage = self.lineEdit.text()
if inImage=='':
QMessageBox.about(self, '提示','图片地址好像还没有选择哦!')
return
else:
inImage = self.lineEdit.text()
targetSize=self.lineEdit_5.text()
if targetSize=='':
QMessageBox.about(self, '提示','期望压缩大小好像还没填哦!')
return
else:
targetSize=self.lineEdit_5.text()
targetSize=int(targetSize)
step=self.lineEdit_6.text()
if step == '':
QMessageBox.about(self, '提示', '压缩比好像还没填哦!')
return
else:
step=self.lineEdit_6.text()
step=int(step)
if not self.checkBox.isChecked(): # 如果不覆盖
outImage = '%s-out.%s'%(inImage.split('.')[0], inImage.split('.')[1])
else:
outImage = inImage
fileSize = self.get_size()
if fileSize <= targetSize:
QMessageBox.about(self, '提示', '原文件大小不能小于预期压缩大小哦!')
return
else:
while fileSize > targetSize:
print("szie",fileSize, targetSize)
image = Image.open(inImage)
image.save('临时文件压缩成功后自动清除.jpg', quality=quality)
fileSize = os.path.getsize('临时文件压缩成功后自动清除.jpg')/1024
quality -= step # 调整压缩比
print(quality,step)
if quality < 0:
print('"%s"压缩失败!(请调整step)'%inImage)
QMessageBox.about(self, '提示', '难过(ಥ﹏ಥ),图片压缩失败!请调整压缩比!')
return
if os.path.exists('临时文件压缩成功后自动清除.jpg'):
copyfile('临时文件压缩成功后自动清除.jpg',outImage)
os.remove('临时文件压缩成功后自动清除.jpg') # 移处临时文件
print('"%s"压缩成功!(大小:%.2fKB)'%(inImage, fileSize))
QMessageBox.about(self, '提示', '太棒了(*^▽^*),图片压缩成功!')
return outImage
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
win = MainForm()
win.show()
sys.exit(app.exec_())
原代码2:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'picture.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(704, 277)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("C:/Users/Administrator/Desktop/test.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
MainWindow.setWindowIcon(icon)
MainWindow.setStyleSheet("")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(80, 210, 121, 16))
self.checkBox.setChecked(False)
self.checkBox.setObjectName("checkBox")
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(80, 50, 216, 25))
self.layoutWidget.setObjectName("layoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget1.setGeometry(QtCore.QRect(80, 170, 583, 25))
self.layoutWidget1.setObjectName("layoutWidget1")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.layoutWidget1)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget1)
self.pushButton_4.setObjectName("pushButton_4")
self.horizontalLayout_4.addWidget(self.pushButton_4)
self.label_5 = QtWidgets.QLabel(self.layoutWidget1)
self.label_5.setObjectName("label_5")
self.horizontalLayout_4.addWidget(self.label_5)
self.lineEdit_5 = QtWidgets.QLineEdit(self.layoutWidget1)
self.lineEdit_5.setObjectName("lineEdit_5")
self.horizontalLayout_4.addWidget(self.lineEdit_5)
self.label_6 = QtWidgets.QLabel(self.layoutWidget1)
self.label_6.setObjectName("label_6")
self.horizontalLayout_4.addWidget(self.label_6)
self.label_7 = QtWidgets.QLabel(self.layoutWidget1)
self.label_7.setObjectName("label_7")
self.horizontalLayout_4.addWidget(self.label_7)
self.lineEdit_6 = QtWidgets.QLineEdit(self.layoutWidget1)
self.lineEdit_6.setObjectName("lineEdit_6")
self.horizontalLayout_4.addWidget(self.lineEdit_6)
self.label_8 = QtWidgets.QLabel(self.layoutWidget1)
self.label_8.setObjectName("label_8")
self.horizontalLayout_4.addWidget(self.label_8)
self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget2.setGeometry(QtCore.QRect(80, 130, 420, 25))
self.layoutWidget2.setObjectName("layoutWidget2")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.layoutWidget2)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget2)
self.pushButton_3.setObjectName("pushButton_3")
self.horizontalLayout_3.addWidget(self.pushButton_3)
self.label_3 = QtWidgets.QLabel(self.layoutWidget2)
self.label_3.setObjectName("label_3")
self.horizontalLayout_3.addWidget(self.label_3)
self.lineEdit_3 = QtWidgets.QLineEdit(self.layoutWidget2)
self.lineEdit_3.setObjectName("lineEdit_3")
self.horizontalLayout_3.addWidget(self.lineEdit_3)
self.label_4 = QtWidgets.QLabel(self.layoutWidget2)
self.label_4.setObjectName("label_4")
self.horizontalLayout_3.addWidget(self.label_4)
self.lineEdit_4 = QtWidgets.QLineEdit(self.layoutWidget2)
self.lineEdit_4.setObjectName("lineEdit_4")
self.horizontalLayout_3.addWidget(self.lineEdit_4)
self.layoutWidget3 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget3.setGeometry(QtCore.QRect(80, 90, 234, 25))
self.layoutWidget3.setObjectName("layoutWidget3")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.layoutWidget3)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget3)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout_2.addWidget(self.pushButton_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget3)
self.lineEdit_2.setObjectName("lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.label_2 = QtWidgets.QLabel(self.layoutWidget3)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(300, 55, 191, 16))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 704, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.checkBox.setText(_translate("MainWindow", "保存后覆盖原地址"))
self.pushButton.setText(_translate("MainWindow", "选取文件"))
self.pushButton_4.setText(_translate("MainWindow", "压缩图片"))
self.label_5.setText(_translate("MainWindow", "预期压缩大小"))
self.label_6.setText(_translate("MainWindow", "KB"))
self.label_7.setText(_translate("MainWindow", "压缩比"))
self.label_8.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ff0000;\">(初始压缩比:100)</span></p></body></html>"))
self.pushButton_3.setText(_translate("MainWindow", "调整图片尺寸"))
self.label_3.setText(_translate("MainWindow", "高度"))
self.label_4.setText(_translate("MainWindow", "宽度"))
self.pushButton_2.setText(_translate("MainWindow", "原文件大小"))
self.label_2.setText(_translate("MainWindow", "KB"))
self.label.setText(_translate("MainWindow", "<html><head/><body><p><span style=\" font-weight:600; color:#ff0000;\">(只能压缩jpg格式的图片哦!)</span></p></body></html>"))