【压缩图片】 python

411 阅读2分钟

这是我参与8月更文挑战的第四天

首先上代码

如果不想复制粘贴 请去下载:

链接:pan.baidu.com/s/1DG7beVFv…

提取码:mtha

import sys
from PyQt5 import QtWidgets,QtGui,QtCore,Qt
from PIL import Image
import os
class GUI(QtWidgets.QWidget):
    def __init__(self):
        #初始化————init__
        super().__init__()
        self.initGUI()
    def initGUI(self):
        #设置窗口大小
        self.resize(500,500)
        #设置窗口位置(下面配置的是居于屏幕中间)
        qr = self.frameGeometry()
        cp = QtWidgets.QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        #设置窗口标题和图标
        self.setWindowTitle('图片压缩')
        self.setWindowIcon(QtGui.QIcon('2.png'))
        #设置窗口提示
        self.setToolTip('窗口提示')
        #设置label信息
        self.label = QtWidgets.QLabel(self)
        # setGeometry(左右, 上下, 宽, 高)
        self.label.setGeometry(QtCore.QRect(80, 10, 330, 80))
        self.label.setText('请输入图片所在路径(如:C:/Users/13509/Desktop/670.png)')
        self.label.setObjectName('label')
        # 设置label提示
        self.label.setToolTip('label提示')
        
         #设置label信息
        self.label1 = QtWidgets.QLabel(self)
        # setGeometry(左右, 上下, 宽, 高)
        self.label1.setGeometry(QtCore.QRect(80, 100, 330, 80))
        self.label1.setText('请输入图片输出路径(如:C:/Users/13509/Desktop/670.png)')
        self.label1.setObjectName('label')
        # 设置label提示
        self.label1.setToolTip('label提示')
        
        
        
        #设置输入框
        self.textbox = Qt.QLineEdit(self)
        self.textbox.resize(320,40)
        self.textbox.move(90, 80)
        #设置输入框1
        self.textbox1 = Qt.QLineEdit(self)
        self.textbox1.resize(320,40)
        self.textbox1.move(90, 160)
        # 设置输入框提示
        self.textbox.setToolTip('输入框提示')
        #设置按钮
        self.btn =QtWidgets.QPushButton('压缩图片',self)
        self.btn.resize(200,40)
        self.btn.move(140,220)
        # 设置按钮样式
        self.btn.setStyleSheet("background-color: #FF3333;"
                          "border-color: rgb(170, 150, 163);"
                          "font: 75 12pt \"Arial Narrow\";"
                          "color: rgb(126, 255, 46);")
        # 设置按钮提示
        self.btn.setToolTip('按钮提示')
        #点击鼠标触发事件
        self.btn.clicked.connect(self.clickbtn)
        #展示窗口
        self.show();
    #点击鼠标触发函数
    def clickbtn(self):
        #打印出输入框的信息
        oldImgae = self.textbox.text()
        newImage = self.textbox1.text()
        compress_image(oldImgae,newImage)
        QtWidgets.QMessageBox.question(self, "信息", '压缩成功',QtWidgets.QMessageBox.Ok, QtWidgets.QMessageBox.Ok)
        #清空输入框信息
       # self.oldImgae.setText('')
    #关闭窗口事件重写
    def closeEvent(self, QCloseEvent):
        reply = QtWidgets.QMessageBox.question(self, '警告',"确定关闭当前窗口?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
        if reply == QtWidgets.QMessageBox.Yes:
            QCloseEvent.accept()
        else:
            QCloseEvent.ignore()

def get_size(file):
    # 获取文件大小:KB
    size = os.path.getsize(file)
    return size / 1024

def get_outfile(infile, outfile):
    if outfile:
        return outfile
    dir, suffix = os.path.splitext(infile)
    outfile = '{}-out{}'.format(dir, suffix)
    return outfile
def compress_image(infile, outfile='', mb=1500, step=10, quality=80):
    """不改变图片尺寸压缩到指定大小
    :param infile: 压缩源文件
    :param outfile: 压缩文件保存地址
    :param mb: 压缩目标,KB
    :param step: 每次调整的压缩比率
    :param quality: 初始压缩比率
    :return: 压缩文件地址,压缩文件大小
    """
    o_size = get_size(infile)
    if o_size <= mb:
        return infile
    outfile = get_outfile(infile, outfile)
    while o_size > mb:
        im = Image.open(infile)
        im.save(outfile, quality=quality)
        if quality - step < 0:
            break
        quality -= step
        o_size = get_size(outfile)
    return outfile, get_size(outfile)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    gui = GUI()
    sys.exit(app.exec_())

运行 此文件

image.png

运行完成后会弹出此窗口

image.png

分别输入图片所在位置 和 压缩后的输出图片地址

image.png

这是我压缩前的图片信息

image.png

压缩成功

image.png

压缩后的图片信息

image.png