图片压缩工具制做教程

前提:

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>"))

附源码下载地址:https://pan.baidu.com/s/1IgP0MV1lAf5eNTycMRY9qA

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值