'''
一个成批缩放处理图片的工具
用于将指定文件夹中的图片文件按指定格式进行进行成批的缩入、旋转及加水印
界面使用box布局,一个垂直QVBox布局,下含个七个水平QHBox布局:
第1行:一个文本框,显示原始图片文件所在位置,一个按钮,用于打开文件夹选择对话框
第2行:一个文本框,显示生成新文件保存位置,一个按钮,用于打开文件夹选择对话框
第3行:一个下拉列表,用于指定图片格式(JPG/PNG或BMP),三个单选按钮,用于设置按图片宽度,高度,或按比例缩放。
两个文本框,用于输入宽度(按宽度缩放时显示)和高度(按高度缩放时显示),一个数学选择器,用于指定图片比例(按比例缩放时显示)
第4行:一个多行文本框,用于滚动显示处理信息。
第5行:一个居中的开始处理按钮
'''
import os
import sys
from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import (QWidget, QPushButton,
QHBoxLayout, QVBoxLayout, QApplication, QLabel,
QLineEdit, QTextEdit, QComboBox, QSpinBox, QRadioButton, QFileDialog, QCheckBox,
QFontDialog, QColorDialog,
)
from PIL import Image
class Thread_do(QThread): # 定义线程类
# 定义带参数一个信号及所需参数
_signal =pyqtSignal(str)
#定义几个成员,用于传递参数,包括:
# 源文件夹,目标文件夹,保存格式,处理方式(约束宽度,约束高度,按比例)及参数(指定宽度,高度或缩放比例)
_filepath=""
_trgpath=""
_fmt=""
_mode=""
_pa=""
#重写类线程类的初步化方法,用于将传入的几个参数保存到类成员中
def __init__(self,_listpara):
super().__init__()
self._filepath=_listpara[0]
self._trgpath=_listpara[1]
self._fmt=_listpara[2]
self._mode=_listpara[3]
self._pa=_listpara[4]
def run(self):#线程的执行方法
for root, dirs, files in os.walk(self._filepath):
# root 表示当前访问的文件夹路径
# dirs 表示该文件夹下的子文件夹名,本函数不涉及子文件夹,不用
# files 表示该文件夹下的文件
# 遍历文件
for f in files:
newtxtinfo = "正在处理:" + os.path.join(root, f) + "..."
im = Image.open(os.path.join(root, f))
iW, iH = im.width, im.height
oW, oH = iW, iH
if self._mode == 3: # 如果是按指定比例缩放,根据参数计算目标文件的宽度和高度
oW = int(iW * int(self._pa) / 100)
oH = int(iH * int(self._pa) / 100)
if self._mode == 1: # 如果是按指定宽度,根据参数计算高度
oW = int(self._pa)
oH = int(int(self._pa) / iW * iH)
if self._mode == 2: # 如果是按指定高度,根据参数计算目标文件的宽度
oH = int(self._pa)
oW = int(int(self._pa) / iH * iW)
om = im.resize((oW, oH))#生成目标文件
#根据原始文件名和保存格式参数,得到目标文件名,如c:\aaa\bbb.jpg,保存到d:\ccc\bbb.png
afname = os.path.join(self._trgpath, f)
bfname = os.path.splitext(afname)[0]
om.save(f"{bfname}.{self._fmt}")#保存目标文件
newtxtinfo += "处理完成。"
self._signal.emit(newtxtinfo)#返回信号
#for d in dirs:对子件夹不处理。如需处理方法参考上面。
self._signal.emit("全部完成")##返回全部完成信号
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#定义布局
vbox = QVBoxLayout()
hbox_line1 = QHBoxLayout()
hbox_line2 = QHBoxLayout()
hbox_line3 = QHBoxLayout()
hbox_line4 = QHBoxLayout()
hbox_line5 = QHBoxLayout()
#第一行,一个标签,一个文件框,一个打开对话框按钮
######################################################
self.txt_SrcPath = QLineEdit("c:/") # 原始文件所在位置,默认为C:/
btn_openDiagSrcPath = QPushButton("...") # 选择源文件夹按钮
#绑定按钮的打开事件
btn_openDiagSrcPath.clicked.connect(self.showDialog_Src)
hbox_line1.addWidget(QLabel("原始图片所在路径:"))
hbox_line1.addWidget(self.txt_SrcPath)
hbox_line1.addWidget(btn_openDiagSrcPath)
# 第二行,一个标签,一个文件框,一个打开对话框按钮
######################################################
self.txt_TrgPath = QLineEdit("c:/") # 原始文件所在位置,默认为C:/
btn_openDiagTrgPath = QPushButton("...") # 选择源文件夹按钮
# 绑定按钮的打开事件
btn_openDiagTrgPath.clicked.connect(self.showDialog_Trg)
hbox_line2.addWidget(QLabel("目标图片保存路径:"))
hbox_line2.addWidget(self.txt_TrgPath)
hbox_line2.addWidget(btn_openDiagTrgPath)
# 第三行,一个标签,一个文件框,一个打开对话框按钮
######################################################
# 定义图片格式下拉列表框
self.lst_PicFmt = QComboBox() # 定义下拉框,并添加三个图片格式选项
self.lst_PicFmt.addItem("JPG")
self.lst_PicFmt.addItem("PNG")
self.lst_PicFmt.addItem("BMP")
self.lst_PicFmt.setMaximumWidth(100)
self.lst_PicFmt.setMinimumWidth(100)
#定义三个单选按钮
self.rbtnWidth = QRadioButton("指定宽定:")
self.rbtnWidth.setObjectName("RW")
self.rbtnHeight = QRadioButton("指定高度:")
self.rbtnHeight.setObjectName("RH")
self.rbtnScale = QRadioButton("按比例缩放:")
self.rbtnScale.setObjectName("RS")
self.rbtnScale.setChecked(True)
# 定义调缩放比例的微调器,并设置其范围为10%-300%,默认值为100%,步长为5
self.spn_sclBl = QSpinBox()
self.spn_sclBl.setRange(10, 300)
self.spn_sclBl.setValue(100)
self.spn_sclBl.setSingleStep(5)
self.spn_sclBl.setMinimumWidth(60)
#定义两个文本框,有于指定图片的宽度或高度
self.txt_sclWidth = QLineEdit("200") # 指定缩放宽度
self.txt_sclWidth.setMinimumWidth(60)
self.txt_sclWidth.setMaximumWidth(60)
self.txt_sclHeight = QLineEdit("160") # 指定缩放高度
self.txt_sclHeight.setMinimumWidth(60)
self.txt_sclHeight.setMaximumWidth(60)
# 默认为按比例缩放,把指定宽度和指定高度文本框设为不可用
self.txt_sclWidth.setEnabled(False)
self.txt_sclHeight.setEnabled(False)
#设置三个单选框的点击事件
self.rbtnWidth.toggled.connect(lambda: self.Click_rbtn(self.rbtnWidth))
self.rbtnHeight.toggled.connect(lambda: self.Click_rbtn(self.rbtnHeight))
self.rbtnScale.toggled.connect(lambda: self.Click_rbtn(self.rbtnScale))
hbox_line3.addWidget(QLabel("保存图片格式:"))
hbox_line3.addWidget(self.lst_PicFmt)
hbox_line3.addWidget(QLabel(" 缩放方式:"))
hbox_line3.addWidget(self.rbtnScale)
hbox_line3.addWidget(self.spn_sclBl)
hbox_line3.addWidget(self.rbtnWidth)
hbox_line3.addWidget(self.txt_sclWidth)
hbox_line3.addWidget(self.rbtnHe
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
picbat.rar (2个子文件)
picbat.py 13KB
picbat.exe 55.01MB
共 2 条
- 1
资源评论
hnkkfan
- 粉丝: 18
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功