(如想转载,请联系博主或贴上本博地址)

此篇为上一篇pyqt5图像压缩小工具改良版。因为比较简单,下面直接贴上代码。

效果图:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'hellopyqt5.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!
import os
import sys
import zlib
#import resource 图标资源可不要
from os import path
from PIL import Image
from glob import glob
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import QFileDialog
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QFrame
from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Form(QMainWindow): def __init__(self):
super(QtWidgets.QMainWindow,self).__init__()
self.setupUi(self)
self.retranslateUi(self) def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(368, 290)
Form.setFixedSize(368, 260)
Form.setWindowTitle('图像压缩工具')
#图标
#Form.setWindowIcon(QIcon(':/1.png')) self.tabWidget = QtWidgets.QTabWidget(Form)
self.tabWidget.setGeometry(QtCore.QRect(10, 10, 351, 271))
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
#指定显示特定tab
#self.tab.setCurrentIndex(0)
self.tab.setObjectName("tab") self.pushButton_4 = QtWidgets.QPushButton(self.tab)
self.pushButton_4.setGeometry(QtCore.QRect(100, 120, 141, 41))
self.pushButton_4.setObjectName("pushButton_4")
#无损选择文件夹
self.pushButton_4.clicked.connect(self.opendicno)
self.pushButton_3 = QtWidgets.QPushButton(self.tab)
self.pushButton_3.setGeometry(QtCore.QRect(120, 70, 101, 41))
self.pushButton_3.setObjectName("pushButton_3")
#无损选择文件
self.pushButton_3.clicked.connect(self.openpicno)
self.label = QtWidgets.QLabel(self.tab)
self.label.setGeometry(QtCore.QRect(20, 10, 281, 51))
self.label.setTextFormat(QtCore.Qt.AutoText)
self.label.setWordWrap(True)
self.label.setObjectName("label")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2") self.pushButton = QtWidgets.QPushButton(self.tab_2)
self.pushButton.setGeometry(QtCore.QRect(120, 70, 101, 41))
self.pushButton.setCheckable(False)
self.pushButton.setObjectName("pushButton")
#有损压缩打开文件
self.pushButton.clicked.connect(self.openfile)
self.pushButton_2 = QtWidgets.QPushButton(self.tab_2)
self.pushButton_2.setGeometry(QtCore.QRect(100, 120, 141, 41))
self.pushButton_2.setCheckable(False)
self.pushButton_2.setObjectName("pushButton_2")
#有损压缩打开文件夹
self.pushButton_2.clicked.connect(self.opendic)
#frame和radiobutton
self.frame = QtWidgets.QFrame(self.tab_2)
self.frame.setGeometry(QtCore.QRect(0, 160, 341, 71))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.frame.setStyleSheet('background-color:#FAEBD7;')
self.frame.setFrameShape(QFrame.Box)
self.frame.setLineWidth(2)
self.radioButton = QtWidgets.QRadioButton(self.frame)
self.radioButton.setGeometry(QtCore.QRect(20, 40, 51, 16))
self.radioButton.setObjectName("radioButton")
self.radioButton_2 = QtWidgets.QRadioButton(self.frame)
self.radioButton_2.setGeometry(QtCore.QRect(100, 40, 51, 16))
self.radioButton_2.setObjectName("radioButton_2")
self.radioButton_3 = QtWidgets.QRadioButton(self.frame)
self.radioButton_3.setGeometry(QtCore.QRect(190, 40, 51, 16))
self.radioButton_3.setObjectName("radioButton_3")
self.radioButton_4 = QtWidgets.QRadioButton(self.frame)
self.radioButton_4.setGeometry(QtCore.QRect(280, 40, 51, 16))
self.radioButton_4.setObjectName("radioButton_4")
#toggled信号与槽函数绑定
self.radioButton.toggled.connect(lambda :self.btnstate(self.radioButton))
self.radioButton_2.toggled.connect(lambda :self.btnstate(self.radioButton_2))
self.radioButton_3.toggled.connect(lambda :self.btnstate(self.radioButton_3))
self.radioButton_4.toggled.connect(lambda :self.btnstate(self.radioButton_4))
#2个label
self.label_3 = QtWidgets.QLabel(self.frame)
self.label_3.setGeometry(QtCore.QRect(10, 10, 81, 21))
self.label_3.setObjectName("label_3")
self.tabWidget.addTab(self.tab_2, "") self.label_2 = QtWidgets.QLabel(self.tab_2)
self.label_2.setGeometry(QtCore.QRect(20, 10, 281, 51))
self.label_2.setTextFormat(QtCore.Qt.AutoText)
self.label_2.setWordWrap(True)
self.label_2.setObjectName("label_2")
self.tabWidget.addTab(self.tab_2, "")
self.tabWidget.setCurrentIndex(0)
self.retranslateUi(Form)
#原来你在这里
#self.tabWidget.setCurrentIndex(1)
QtCore.QMetaObject.connectSlotsByName(Form) bs=float(0.8)
def btnstate(self,btn):
global bs
if btn.text()=='0.8X':
if btn.isChecked()==True:
bs=float(0.8)
print(bs)
else:
print("0.8没有被选中")
if btn.text()=='0.6X':
if btn.isChecked()==True:
#global bs
bs=float(0.6)
print(bs)
else:
print("0.6没有被选中")
if btn.text()=='0.4X':
if btn.isChecked()==True:
#global bs
bs=float(0.4)
print(bs)
else:
print("0.4没有被选中")
if btn.text()=='0.2X':
if btn.isChecked()==True:
#global bs
bs=float(0.2)
print(bs)
else:
print("0.2没有被选中") def openfile(self):
try:
if self.radioButton.isChecked()==True or self.radioButton_2.isChecked()==True or self.radioButton_3.isChecked()==True or self.radioButton_4.isChecked()==True:
filename ,filetype = QFileDialog.getOpenFileName(self,"选择文件","./","All Files (*);;Image Files (*.jpg)")
if filename != '':
path=filename.replace(r'/',r'\\')
try:
img = Image.open(path) # 打开图片文件
if img.width>5:
#等比例缩小
width=img.width
height=img.height
size=(width*bs,height*bs)
img.thumbnail(size, Image.ANTIALIAS) # 使用抗锯齿模式生成缩略图(压缩图片)
f=os.path.splitext(path)
newname=f[0] + '-已压缩'
newname=newname+f[1]
img.save(newname, "JPEG") # 保存成与原文件名一致的文件,会自动覆盖源文件
else:
print(file + "宽度小,已忽略")
except Exception as e:
print(e)
QMessageBox.information(self,"恭喜,成功了!", "已成功压缩图片到原有目录",QMessageBox.Yes)#QMessageBox.Yes | QMessageBox.No
else:
QMessageBox.warning(self,"选择压缩比例", "请先选择压缩比例。",QMessageBox.Yes)
except Exception as e:
print(e) def opendic(self):
try:
if self.radioButton.isChecked()==True or self.radioButton_2.isChecked()==True or self.radioButton_3.isChecked()==True or self.radioButton_4.isChecked()==True:
dic = QFileDialog.getExistingDirectory(self,"选择文件夹", "./")
if dic != '':
path=dic.replace(r'/',r'\\')
# glob.glob()用来进行模糊查询,增加参数recursive=True后可以使用**/来匹配所有子目录
files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.jpg", recursive=True)
total = len(files) #总文件数
cur = 1 #当前文件序号
for infile in files:
try:
print("进度:" + str(cur) + "/" + str(total) + " " + infile)
img = Image.open(infile) # 打开图片文件
if img.width>5:
width=img.width
height=img.height
size=(width*bs,height*bs)
img.thumbnail(size, Image.ANTIALIAS) # 使用抗锯齿模式生成缩略图(压缩图片)
f=os.path.splitext(infile)
newname=f[0] + '-已压缩'
newname=newname+f[1]
img.save(newname, "JPEG") # infile保存成与原文件名一致的文件,会自动覆盖源文件
else:
print(infile + "宽度小,无需处理,已忽略")
cur = cur + 1
except Exception as e:
print(e)
QMessageBox.information(self,"恭喜,成功了!", "已成功压缩图片到原有目录",QMessageBox.Yes)
else:
QMessageBox.warning(self,"选择压缩比例", "请先选择压缩比例。",QMessageBox.Yes)
except Exception as e:
print(e) def openpicno(self):
filename ,filetype = QFileDialog.getOpenFileName(self,"选择文件","./","All Files (*);;Image Files (*.jpg)")
if filename != '':
try:
path=filename.replace(r'/',r'\\')
im = Image.open(path) # 打开图片
imBytes = im.tobytes() # 把图片转换成bytes流
imBytes = zlib.compress(imBytes, 9) # 对图像字节串进行压缩,第二个参数是压缩率有-1,0-9,按个人情况进行设置,我都试过了感觉没多大变化,所以随便设置了5
im2 = Image.frombytes('RGB', im.size, zlib.decompress(imBytes)) # 压缩成新的图片
f=os.path.splitext(path)
newname=f[0] + '-已压缩'
newname=newname+f[1]
im2.save(newname) # 保存成与原文件名一致的文件,会自动覆盖源文件
QMessageBox.information(self,"恭喜,成功了!", "已成功压缩图片到原有目录",QMessageBox.Yes)
except Exception as e:
print(e) def opendicno(self):
dic = QFileDialog.getExistingDirectory(self,"选择文件夹", "./")
path=dic.replace(r'/',r'\\')
if dic != '':
path=dic.replace(r'/',r'\\')
# glob.glob()用来进行模糊查询,增加参数recursive=True后可以使用**/来匹配所有子目录
files = glob( path + "**/*.JPG", recursive=True) + glob(path + "**/*.jpg", recursive=True)
total = len(files) #总文件数
print(total)
cur = 1 #当前文件序号
for infile in files:
try:
im = Image.open(infile) # 打开
if im.width>5:
imBytes = im.tobytes()
imBytes = zlib.compress(imBytes, 9)
im2 = Image.frombytes('RGB', im.size, zlib.decompress(imBytes)) # 压缩成新图片
#改名------------------------
f=os.path.splitext(infile)
newname=f[0] + '-已压缩'
newname=newname+f[1]
#改名------------------------
im2.save(newname, "JPEG") # 保存成与原文件名一致的文件,会自动覆盖源文件
else:
print(infile + "宽度小于1200px,无需处理,已忽略")
cur = cur + 1
except Exception as e:
print(e)
QMessageBox.information(self,"恭喜,成功了!", "已成功压缩图片到原有目录",QMessageBox.Yes) def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "图像压缩工具"))
self.pushButton_4.setText(_translate("Form", "选择文件夹"))
self.pushButton_3.setText(_translate("Form", "选择文件"))
self.label.setText(_translate("Form", "注:无损压缩不改变图像分辨率,仅改变DPI,适合10M以上超大图片压缩,如需要进一步压缩,可再进行有损压缩。"))
self.label_2.setText(_translate("Form", "注:通过缩小图像分辨率压缩图片。请先选择合适的缩小比例。"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "无损压缩"))
self.pushButton.setText(_translate("Form", "选择文件"))
self.pushButton_2.setText(_translate("Form", "选择文件夹"))
self.radioButton.setText(_translate("Form", "0.8X"))
self.radioButton_2.setText(_translate("Form", "0.6X"))
self.radioButton_3.setText(_translate("Form", "0.4X"))
self.radioButton_4.setText(_translate("Form", "0.2X"))
self.label_3.setText(_translate("Form", "选择压缩比例"))
self.label_3.setToolTip(_translate("Form", "<html><head/><body><p>手动指定压缩分辨率</p></body></html>"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "有损压缩")) #
self.tabWidget.setCurrentIndex(self.tabWidget.indexOf(self.tab)) if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())

python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记的更多相关文章

  1. python练习册 每天一个小程序 第0013题

    # -*-coding:utf-8-*- ''' 题目描述: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-) 地址: http://tieba.baidu.com/p/21 ...

  2. python练习册 每天一个小程序 第0001题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...

  3. python练习册 每天一个小程序 第0000题

    PIL库学习链接:http://blog.csdn.net/column/details/pythonpil.html?&page=1 1 #-*-coding:utf-8-*- 2 __au ...

  4. python练习册 每天一个小程序 第0007题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但 ...

  5. python练习册 每天一个小程序 第0010题

    # -*-coding:utf-8-*- ''' 题目描述: 使用 Python 生成类似于下图中的字母验证码图片 思路: 运用PIL库加random 随机字母进行生成 ''' import rand ...

  6. python练习册 每天一个小程序 第0009题

    1 ''' 2 题目描述: 3 找出一个html文件中所有的url 4 5 思路 : 6 利用正则表达式进行匹配 7 8 ''' 9 10 11 import re 12 13 14 with ope ...

  7. python练习册 每天一个小程序 第0008题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 一个HTML文件,找出里面的正文. 6 7 思路: 8 利用Beautiful ...

  8. python练习册 每天一个小程序 第0006题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 你有一个目录,放了你一个月的日记,都是 txt,为了避免分词的问题,假设内容都 ...

  9. python练习册 每天一个小程序 第0005题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目说明: 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小 ...

  10. python练习册 每天一个小程序 第0012题

    # -*-coding:utf-8-*- def test(content): text = content flag = 0 with open('filtered_words.txt') as f ...

随机推荐

  1. leetcode 94. 二叉树的中序遍历【时间击败99.19%】 【内存击败39.48%】

    public List<Integer> inorderTraversal(TreeNode root) { ArrayList<Integer>al=new ArrayLis ...

  2. 大规模人脸分类—allgather操作(2)

    腾讯开源人脸识别训练代码TFace 中关于all_gather层的实现如下.接下来解释为什么backward要进行reduce相加操作. https://github.com/Tencent/TFac ...

  3. ue项目--浏览器出现卡顿及崩溃的原因查找与解决方案

    一些内存泄露的情况进行了排查 全局变量 定时器 使用未销毁的全局事件和第三方库 v-if和v-show不合理使用,v-if和v-for不合理使用 使用watch

  4. iview table配合Tooltip使用的时候 气泡错位的问题

    Tooltip 气泡错位 点击table的单元格,实现遮盖文字的预览功能,但是气泡会发生偏移,看了Tooltip的样式发现 气泡是绝对定位, 想到子绝父相,于是给表格的td添加相对定位的功能,结果能解 ...

  5. C语言的所有函数

    auto 声明自动变量break 跳出当前循环case 开关语句分支char 声明字符型变量或函数返回值类型const 定义常量,如果一个变量被cost修饰,那么他的值就不能再被改变continue ...

  6. 安装ELK(Elasticsearch、Kibana、Logstash)

    1.首先准备两台centos7虚拟机(关闭防火墙)(到步骤3为止都是两台虚拟机都要准备的) 2.传入安装包 3.解压ELK.进入解压后ELK文件.解压jdk文件 4.在ip为41的虚拟机上安装Elas ...

  7. Spring之IOC(控制反转)入门理解

    在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高(假如程序耦合性过高,改一处代码通常要对其他地方也要做大量修改,难以维护).控制反转(Invers ...

  8. 1=C到底是哪个C

  9. 20200923--计算鞍点(奥赛一本通P91 4)

    给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点.鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值. 例如:在下面的例子中(第4行第1列的元素就是鞍 ...

  10. 数组(Java)

    数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成 其中,每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 数组的声明和创建 基本 ...