怎么在python中使用pyqt5实现一个图片批量缩放工具?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。
通过命令行安装。
pip install pillow pip install pyqt5
代码:
#!-*-coding:utf-8-*- from PIL import Image import hashlib, os, sys from PyQt5.QtGui import QFont, QIcon from PyQt5.QtWidgets import (QFileDialog, QMessageBox, QGridLayout, QLineEdit, QTextEdit, QLabel, QWidget, QToolTip, QPushButton, QApplication, QInputDialog) from PyQt5.QtCore import QCoreApplication def makedir(path): if not os.path.exists(path): os.mkdir(path) def image_resize(image_path, scale): #获得新文件名称 out_path = os.path.splitext(image_path)[0] + "_after" + os.path.splitext(image_path)[-1] with Image.open( image_path ) as im: width = int(im.size[0]*scale) height = int(im.size[1]*scale) #resize 设置新尺寸 out = im.resize( (width, height) ) out.save(out_path) def folder_resize(folder_path, scale): dst_files = [] files = os.listdir( folder_path ) for file in files: ext = os.path.splitext(file)[-1] #只支持jpg或png文件 if ext == ".jpg" or ext == ".png": dst_files.append(file) #输出路径 out_folder = os.path.join(folder_path, "after") makedir(out_folder) for item in dst_files: try: op = os.path.join( out_folder, item ) with Image.open( os.path.join(folder_path, item) ) as im: width = int(im.size[0]*scale) height = int(im.size[1]*scale) out = im.resize( (width, height) ) out.save(op) except FileNotFoundError: print("file not found " + item) class MainBody(QWidget): def __init__(self): super(MainBody, self).__init__() self.init() self.m_scale = 1.0 self.m_width = 0 self.m_height = 0 def init(self): grid = QGridLayout() self.setLayout(grid) grid.setSpacing(10) self.m_tedit = QTextEdit() self.m_tedit.setToolTip( u'可以拖拽文件到这里来' ) grid.addWidget(self.m_tedit, 1, 0, 4, 3) self.m_scale_set_btn = QPushButton( u"设置缩放值" ) self.m_scale_set_btn.clicked.connect( self.set_scale_func ) grid.addWidget( self.m_scale_set_btn, 1, 3 ) self.m_scale_label = QLabel( "1.0" ) grid.addWidget( self.m_scale_label, 2, 3 ) self.m_height_set_btn = QPushButton( u"设置高度" ) self.m_height_set_btn.clicked.connect( self.set_height_func ) grid.addWidget( self.m_height_set_btn, 3, 3 ) self.m_height_label = QLabel( "0" ) grid.addWidget( self.m_height_label, 4, 3 ) self.m_width_set_btn = QPushButton( u"设置宽度" ) self.m_width_set_btn.clicked.connect( self.set_width_func ) grid.addWidget( self.m_width_set_btn, 5, 3 ) self.m_width_label = QLabel( "0" ) grid.addWidget( self.m_width_label, 6, 3 ) self.m_file_btn = QPushButton(u'选择文件') self.m_file_btn.clicked.connect( self.file_func ) self.m_folder_btn = QPushButton(u'选择文件夹') self.m_folder_btn.clicked.connect( self.folder_func ) self.m_generate_btn = QPushButton(u'处理') self.m_generate_btn.clicked.connect( self.generate_func ) self.m_clear_btn = QPushButton(u'清空') self.m_clear_btn.clicked.connect( self.clear_func ) grid.addWidget(self.m_file_btn, 5, 0) grid.addWidget(self.m_folder_btn, 5, 1) grid.addWidget(self.m_generate_btn, 6, 0) grid.addWidget(self.m_clear_btn, 6, 1) self.setGeometry(300,300,300,200) self.setWindowTitle(u"批量图片缩放") self.setWindowIcon(QIcon('icon.png')) self.show() #按照输入的缩放值进行缩放 def set_scale_func(self): text, ok = QInputDialog.getText( self, 'Input Scale', u'输入缩放值' ) if ok: try: scale = float( text ) except ValueError: QMessageBox.warning( self, u"设置缩放值", u"输入错误" ) else: self.m_scale = scale self.refresh_setting(0) #根据高度的缩放比例等比例缩放 def set_height_func(self): text, ok = QInputDialog.getText( self, 'Input Height', u'输入高度' ) if ok: try: height = int( text ) except ValueError: QMessageBox.warning( self, u"设置高度", u"输入错误" ) else: self.m_height = height self.refresh_setting(2) #根据宽度的缩放比例等比例缩放 def set_width_func(self): text, ok = QInputDialog.getText( self, 'Input Width', u'输入宽度' ) if ok: try: width = int( text ) except ValueError: QMessageBox.warning( self, u"设置宽度", u"输入错误" ) else: self.m_width = width self.refresh_setting(1) def file_func(self): filename, ok = QFileDialog.getOpenFileName(self, "Open File", "C:/Users/Administrator/Desktop", "JPG (*.jpg);;PNG (*.png)") if ok: self.m_tedit.setText( filename ) size = self.get_image_size( filename ) s,w,h = self.get_current_setting() self.m_width = int(size[0]*s) self.m_height = int(size[1]*s) self.m_height_label.setText( str( self.m_height ) ) self.m_width_label.setText( str( self.m_width ) ) def folder_func(self): filename = QFileDialog.getExistingDirectory(self, "Open File", "C:/Users/Administrator/Desktop") self.m_tedit.setText( filename ) def generate_func(self): path = self.get_image_path() if path == None or path == "": QMessageBox.warning( self, u"Error", u"未选择文件" ) return elif os.path.exists(path) == False: QMessageBox.warning( self, u"Error", u"文件不存在" ) return if os.path.isdir(path): folder_resize( path, self.m_scale ) elif os.path.isfile(path): image_resize( path, self.m_scale ) def clear_func(self): self.m_tedit.clear() self.m_width = 0 self.m_height = 0 self.m_width_label.setText("0") self.m_height_label.setText("0") def get_image_size(self, image_path): with Image.open(image_path) as im: return im.size def get_image_path(self): path = self.m_tedit.toPlainText() if path.startswith( 'file:///' ): path = path[8:] return path def get_current_setting(self): return self.m_scale, self.m_width, self.m_height def refresh_setting(self, kind): s, w, h = self.get_current_setting() p = self.get_image_path() if kind == 0: if p == None or p == "" or os.path.exists(p) == False or os.path.isdir(p) == True: w = 0 h = 0 else: size = self.get_image_size(p) w = size[0]*s h = size[1]*s elif kind == 1: if p == None or p == "" or os.path.exists(p) == False: QMessageBox.warning( self, u"Warning", u"请先选择文件" ) return elif os.path.isdir(p) == True: QMessageBox.warning( self, u"Warning", u"文件夹不能设置宽度" ) return size = self.get_image_size(p) w = int(w) s = w*1.0/size[0] h = int((w/size[0])*size[1]) elif kind == 2: if p == None or p == "" or os.path.exists(p) == False: QMessageBox.warning( self, u"Warning", u"请先选择文件" ) return elif os.path.isdir(p) == True: QMessageBox.warning( self, u"Warning", u"文件夹不能设置高度" ) return size = self.get_image_size(p) h = int(h) s = h*1.0/size[1] w = int((h/size[1])*size[0]) self.m_width = int(w) self.m_height = int(h) self.m_scale = float(s) self.m_width_label.setText(str(self.m_width)) self.m_height_label.setText(str(self.m_height)) self.m_scale_label.setText(str(self.m_scale)) if __name__ == "__main__": app = QApplication(sys.argv) mb = MainBody() sys.exit( app.exec_() )
看完上述内容,你们掌握怎么在python中使用pyqt5实现一个图片批量缩放工具的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。