zoukankan      html  css  js  c++  java
  • 基于pyqt5的图片素材批量处理工具

    • 功能

        分辨率的批量转换,文件夹递归查找

        像素偏移量批量调整,文件夹单层查找

        画布的大小的批量进行调整,不进行缩放,文件夹单层查找

    • 界面

    • 通过PyUIC生成的代码
      1 # -*- coding: utf-8 -*-
      2 
      3 # Form implementation generated from reading ui file 'E:DevelopmentIProcesser/IProcessingDialog.ui'
      4 #
      5 # Created by: PyQt5 UI code generator 5.5.1
      6 #
      7 # WARNING! All changes made in this file will be lost!
      8 
      9 from PyQt5 import QtCore, QtGui, QtWidgets
     10 
     11 class Ui_Dialog(object):
     12     def setupUi(self, Dialog):
     13         Dialog.setObjectName("Dialog")
     14         Dialog.resize(411, 525)
     15         self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog)
     16         self.verticalLayout_2.setObjectName("verticalLayout_2")
     17         self.tabWidget = QtWidgets.QTabWidget(Dialog)
     18         self.tabWidget.setObjectName("tabWidget")
     19         self.tab = QtWidgets.QWidget()
     20         self.tab.setObjectName("tab")
     21         self.verticalLayout = QtWidgets.QVBoxLayout(self.tab)
     22         self.verticalLayout.setObjectName("verticalLayout")
     23         self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
     24         self.horizontalLayout_5.setObjectName("horizontalLayout_5")
     25         self.label_5 = QtWidgets.QLabel(self.tab)
     26         self.label_5.setObjectName("label_5")
     27         self.horizontalLayout_5.addWidget(self.label_5)
     28         self.reslotion_src_le = QtWidgets.QLineEdit(self.tab)
     29         self.reslotion_src_le.setObjectName("reslotion_src_le")
     30         self.horizontalLayout_5.addWidget(self.reslotion_src_le)
     31         self.reslotion_src_view_btn = QtWidgets.QPushButton(self.tab)
     32         self.reslotion_src_view_btn.setObjectName("reslotion_src_view_btn")
     33         self.horizontalLayout_5.addWidget(self.reslotion_src_view_btn)
     34         self.verticalLayout.addLayout(self.horizontalLayout_5)
     35         self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
     36         self.horizontalLayout_7.setObjectName("horizontalLayout_7")
     37         self.label_8 = QtWidgets.QLabel(self.tab)
     38         self.label_8.setObjectName("label_8")
     39         self.horizontalLayout_7.addWidget(self.label_8)
     40         self.reslotion_dst_le = QtWidgets.QLineEdit(self.tab)
     41         self.reslotion_dst_le.setEnabled(True)
     42         self.reslotion_dst_le.setObjectName("reslotion_dst_le")
     43         self.horizontalLayout_7.addWidget(self.reslotion_dst_le)
     44         self.reslotion_dst_view_btn = QtWidgets.QPushButton(self.tab)
     45         self.reslotion_dst_view_btn.setObjectName("reslotion_dst_view_btn")
     46         self.horizontalLayout_7.addWidget(self.reslotion_dst_view_btn)
     47         self.verticalLayout.addLayout(self.horizontalLayout_7)
     48         self.horizontalLayout = QtWidgets.QHBoxLayout()
     49         self.horizontalLayout.setObjectName("horizontalLayout")
     50         self.label_6 = QtWidgets.QLabel(self.tab)
     51         self.label_6.setObjectName("label_6")
     52         self.horizontalLayout.addWidget(self.label_6)
     53         self.reslotion_srcw_le = QtWidgets.QLineEdit(self.tab)
     54         self.reslotion_srcw_le.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
     55         self.reslotion_srcw_le.setObjectName("reslotion_srcw_le")
     56         self.horizontalLayout.addWidget(self.reslotion_srcw_le)
     57         self.label_7 = QtWidgets.QLabel(self.tab)
     58         self.label_7.setObjectName("label_7")
     59         self.horizontalLayout.addWidget(self.label_7)
     60         self.reslotion_srch_le = QtWidgets.QLineEdit(self.tab)
     61         self.reslotion_srch_le.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
     62         self.reslotion_srch_le.setObjectName("reslotion_srch_le")
     63         self.horizontalLayout.addWidget(self.reslotion_srch_le)
     64         self.label_10 = QtWidgets.QLabel(self.tab)
     65         self.label_10.setObjectName("label_10")
     66         self.horizontalLayout.addWidget(self.label_10)
     67         self.reslotion_dstw_le = QtWidgets.QLineEdit(self.tab)
     68         self.reslotion_dstw_le.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
     69         self.reslotion_dstw_le.setObjectName("reslotion_dstw_le")
     70         self.horizontalLayout.addWidget(self.reslotion_dstw_le)
     71         self.label_9 = QtWidgets.QLabel(self.tab)
     72         self.label_9.setObjectName("label_9")
     73         self.horizontalLayout.addWidget(self.label_9)
     74         self.reslotion_dsth_le = QtWidgets.QLineEdit(self.tab)
     75         self.reslotion_dsth_le.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
     76         self.reslotion_dsth_le.setObjectName("reslotion_dsth_le")
     77         self.horizontalLayout.addWidget(self.reslotion_dsth_le)
     78         self.verticalLayout.addLayout(self.horizontalLayout)
     79         self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
     80         self.horizontalLayout_8.setObjectName("horizontalLayout_8")
     81         spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
     82         self.horizontalLayout_8.addItem(spacerItem)
     83         self.reslotion_submit_btn = QtWidgets.QPushButton(self.tab)
     84         self.reslotion_submit_btn.setEnabled(True)
     85         self.reslotion_submit_btn.setObjectName("reslotion_submit_btn")
     86         self.horizontalLayout_8.addWidget(self.reslotion_submit_btn)
     87         self.verticalLayout.addLayout(self.horizontalLayout_8)
     88         self.tabWidget.addTab(self.tab, "")
     89         self.tab_2 = QtWidgets.QWidget()
     90         self.tab_2.setObjectName("tab_2")
     91         self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.tab_2)
     92         self.verticalLayout_4.setObjectName("verticalLayout_4")
     93         self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
     94         self.horizontalLayout_2.setObjectName("horizontalLayout_2")
     95         self.label = QtWidgets.QLabel(self.tab_2)
     96         self.label.setObjectName("label")
     97         self.horizontalLayout_2.addWidget(self.label)
     98         self.offset_pixel_le = QtWidgets.QLineEdit(self.tab_2)
     99         self.offset_pixel_le.setObjectName("offset_pixel_le")
    100         self.horizontalLayout_2.addWidget(self.offset_pixel_le)
    101         self.label_2 = QtWidgets.QLabel(self.tab_2)
    102         self.label_2.setObjectName("label_2")
    103         self.horizontalLayout_2.addWidget(self.label_2)
    104         self.offset_meter_le = QtWidgets.QLineEdit(self.tab_2)
    105         self.offset_meter_le.setObjectName("offset_meter_le")
    106         self.horizontalLayout_2.addWidget(self.offset_meter_le)
    107         self.label_3 = QtWidgets.QLabel(self.tab_2)
    108         self.label_3.setObjectName("label_3")
    109         self.horizontalLayout_2.addWidget(self.label_3)
    110         self.verticalLayout_4.addLayout(self.horizontalLayout_2)
    111         self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
    112         self.horizontalLayout_3.setObjectName("horizontalLayout_3")
    113         self.label_4 = QtWidgets.QLabel(self.tab_2)
    114         self.label_4.setObjectName("label_4")
    115         self.horizontalLayout_3.addWidget(self.label_4)
    116         self.offset_dire_le = QtWidgets.QLineEdit(self.tab_2)
    117         self.offset_dire_le.setObjectName("offset_dire_le")
    118         self.horizontalLayout_3.addWidget(self.offset_dire_le)
    119         self.offset_view_btn = QtWidgets.QPushButton(self.tab_2)
    120         self.offset_view_btn.setObjectName("offset_view_btn")
    121         self.horizontalLayout_3.addWidget(self.offset_view_btn)
    122         self.verticalLayout_4.addLayout(self.horizontalLayout_3)
    123         self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
    124         self.horizontalLayout_4.setObjectName("horizontalLayout_4")
    125         self.label_11 = QtWidgets.QLabel(self.tab_2)
    126         self.label_11.setObjectName("label_11")
    127         self.horizontalLayout_4.addWidget(self.label_11)
    128         self.offset_ltx_le = QtWidgets.QLineEdit(self.tab_2)
    129         self.offset_ltx_le.setMaximumSize(QtCore.QSize(50, 16777215))
    130         self.offset_ltx_le.setObjectName("offset_ltx_le")
    131         self.horizontalLayout_4.addWidget(self.offset_ltx_le)
    132         self.label_12 = QtWidgets.QLabel(self.tab_2)
    133         self.label_12.setObjectName("label_12")
    134         self.horizontalLayout_4.addWidget(self.label_12)
    135         self.offset_lty_le = QtWidgets.QLineEdit(self.tab_2)
    136         self.offset_lty_le.setMaximumSize(QtCore.QSize(50, 16777215))
    137         self.offset_lty_le.setObjectName("offset_lty_le")
    138         self.horizontalLayout_4.addWidget(self.offset_lty_le)
    139         spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
    140         self.horizontalLayout_4.addItem(spacerItem1)
    141         self.rename_ckb = QtWidgets.QCheckBox(self.tab_2)
    142         self.rename_ckb.setObjectName("rename_ckb")
    143         self.horizontalLayout_4.addWidget(self.rename_ckb)
    144         self.verticalLayout_4.addLayout(self.horizontalLayout_4)
    145         self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
    146         self.horizontalLayout_6.setObjectName("horizontalLayout_6")
    147         spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
    148         self.horizontalLayout_6.addItem(spacerItem2)
    149         self.offset_submit_btn = QtWidgets.QPushButton(self.tab_2)
    150         self.offset_submit_btn.setObjectName("offset_submit_btn")
    151         self.horizontalLayout_6.addWidget(self.offset_submit_btn)
    152         self.verticalLayout_4.addLayout(self.horizontalLayout_6)
    153         self.tabWidget.addTab(self.tab_2, "")
    154         self.tab_5 = QtWidgets.QWidget()
    155         self.tab_5.setObjectName("tab_5")
    156         self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.tab_5)
    157         self.verticalLayout_5.setObjectName("verticalLayout_5")
    158         self.horizontalLayout_9 = QtWidgets.QHBoxLayout()
    159         self.horizontalLayout_9.setObjectName("horizontalLayout_9")
    160         self.label_13 = QtWidgets.QLabel(self.tab_5)
    161         self.label_13.setObjectName("label_13")
    162         self.horizontalLayout_9.addWidget(self.label_13)
    163         self.size_directory_le = QtWidgets.QLineEdit(self.tab_5)
    164         self.size_directory_le.setObjectName("size_directory_le")
    165         self.horizontalLayout_9.addWidget(self.size_directory_le)
    166         self.size_view_btn = QtWidgets.QPushButton(self.tab_5)
    167         self.size_view_btn.setObjectName("size_view_btn")
    168         self.horizontalLayout_9.addWidget(self.size_view_btn)
    169         self.verticalLayout_5.addLayout(self.horizontalLayout_9)
    170         self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
    171         self.horizontalLayout_10.setObjectName("horizontalLayout_10")
    172         self.label_14 = QtWidgets.QLabel(self.tab_5)
    173         self.label_14.setObjectName("label_14")
    174         self.horizontalLayout_10.addWidget(self.label_14)
    175         self.size_width_le = QtWidgets.QLineEdit(self.tab_5)
    176         self.size_width_le.setInputMethodHints(QtCore.Qt.ImhNone)
    177         self.size_width_le.setObjectName("size_width_le")
    178         self.horizontalLayout_10.addWidget(self.size_width_le)
    179         self.label_15 = QtWidgets.QLabel(self.tab_5)
    180         self.label_15.setObjectName("label_15")
    181         self.horizontalLayout_10.addWidget(self.label_15)
    182         self.size_height_le = QtWidgets.QLineEdit(self.tab_5)
    183         self.size_height_le.setInputMethodHints(QtCore.Qt.ImhNone)
    184         self.size_height_le.setObjectName("size_height_le")
    185         self.horizontalLayout_10.addWidget(self.size_height_le)
    186         self.verticalLayout_5.addLayout(self.horizontalLayout_10)
    187         spacerItem3 = QtWidgets.QSpacerItem(20, 41, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
    188         self.verticalLayout_5.addItem(spacerItem3)
    189         self.horizontalLayout_11 = QtWidgets.QHBoxLayout()
    190         self.horizontalLayout_11.setObjectName("horizontalLayout_11")
    191         spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
    192         self.horizontalLayout_11.addItem(spacerItem4)
    193         self.size_submit_btn = QtWidgets.QPushButton(self.tab_5)
    194         self.size_submit_btn.setObjectName("size_submit_btn")
    195         self.horizontalLayout_11.addWidget(self.size_submit_btn)
    196         self.verticalLayout_5.addLayout(self.horizontalLayout_11)
    197         self.tabWidget.addTab(self.tab_5, "")
    198         self.verticalLayout_2.addWidget(self.tabWidget)
    199         self.groupBox_3 = QtWidgets.QGroupBox(Dialog)
    200         self.groupBox_3.setObjectName("groupBox_3")
    201         self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_3)
    202         self.verticalLayout_3.setObjectName("verticalLayout_3")
    203         self.output_lw = QtWidgets.QListWidget(self.groupBox_3)
    204         self.output_lw.setObjectName("output_lw")
    205         self.verticalLayout_3.addWidget(self.output_lw)
    206         self.verticalLayout_2.addWidget(self.groupBox_3)
    207         self.verticalLayout_2.setStretch(1, 2)
    208 
    209         self.retranslateUi(Dialog)
    210         self.tabWidget.setCurrentIndex(0)
    211         QtCore.QMetaObject.connectSlotsByName(Dialog)
    212 
    213     def retranslateUi(self, Dialog):
    214         _translate = QtCore.QCoreApplication.translate
    215         Dialog.setWindowTitle(_translate("Dialog", "IProcesser"))
    216         self.label_5.setText(_translate("Dialog", "Src:"))
    217         self.reslotion_src_view_btn.setText(_translate("Dialog", "View..."))
    218         self.label_8.setText(_translate("Dialog", "Dst:"))
    219         self.reslotion_dst_view_btn.setText(_translate("Dialog", "View..."))
    220         self.label_6.setText(_translate("Dialog", "SrcW"))
    221         self.label_7.setText(_translate("Dialog", "SrcH"))
    222         self.label_10.setText(_translate("Dialog", "DstW:"))
    223         self.label_9.setText(_translate("Dialog", "DstH:"))
    224         self.reslotion_submit_btn.setText(_translate("Dialog", "Submit"))
    225         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Dialog", "分辨率转换"))
    226         self.label.setText(_translate("Dialog", "设定像素比:"))
    227         self.offset_pixel_le.setPlaceholderText(_translate("Dialog", "1"))
    228         self.label_2.setText(_translate("Dialog", "Pixel"))
    229         self.offset_meter_le.setPlaceholderText(_translate("Dialog", "1"))
    230         self.label_3.setText(_translate("Dialog", "Meter"))
    231         self.label_4.setText(_translate("Dialog", "序列文件夹:"))
    232         self.offset_view_btn.setText(_translate("Dialog", "View..."))
    233         self.label_11.setText(_translate("Dialog", "LTx:"))
    234         self.offset_ltx_le.setPlaceholderText(_translate("Dialog", "0"))
    235         self.label_12.setText(_translate("Dialog", "LTy:"))
    236         self.offset_lty_le.setPlaceholderText(_translate("Dialog", "0"))
    237         self.rename_ckb.setText(_translate("Dialog", "改名"))
    238         self.offset_submit_btn.setText(_translate("Dialog", "Submit"))
    239         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Dialog", "偏移值调整"))
    240         self.label_13.setText(_translate("Dialog", "目录:"))
    241         self.size_view_btn.setText(_translate("Dialog", "View..."))
    242         self.label_14.setText(_translate("Dialog", "设定宽度:"))
    243         self.label_15.setText(_translate("Dialog", "设定高度:"))
    244         self.size_submit_btn.setText(_translate("Dialog", "Submit"))
    245         self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _translate("Dialog", "尺寸调整"))
    246         self.groupBox_3.setTitle(_translate("Dialog", "输出"))
    247 
    248 import IProcessing_rc
    View Code
    • Wrap PyUIC生成的代码
      1 # coding=utf-8
      2 import os, shutil, threading, math
      3 from PIL import Image
      4 from PyQt5.QtCore import *
      5 from PyQt5.QtGui import QIcon
      6 from PyQt5.QtWidgets import *
      7 
      8 import IProcessingDialog
      9 import IProcessing_rc
     10 
     11 class IPDW(QDialog, IProcessingDialog.Ui_Dialog):
     12     output_lw_signal = pyqtSignal(str)
     13     reslotion_submit_signal = pyqtSignal()
     14 
     15     def __init__(self):
     16         super(IPDW, self).__init__()
     17         self.setupUi(self)
     18         # icon
     19         self.setWindowIcon(QIcon(':/icon/icon.ico'))
     20         # 信号连接
     21         self.output_lw_signal.connect(self.output_lw_signal_proc)
     22         # 分辨率调整
     23         self.reslotion_src_view_btn.clicked.connect(self.reslotion_src_view_btn_clicked)
     24         self.reslotion_dst_view_btn.clicked.connect(self.reslotion_dst_view_btn_clicked)
     25         self.reslotion_submit_btn.clicked.connect(self.reslotion_submit_btn_clicked)
     26         # 偏移调整
     27         self.offset_view_btn.clicked.connect(self.offset_view_btn_clicked)
     28         self.offset_submit_btn.clicked.connect(self.offset_submit_btn_clicked)
     29         # 尺寸调整
     30         self.size_view_btn.clicked.connect(self.size_view_btn_clicked)
     31         self.size_submit_btn.clicked.connect(self.size_submit_btn_clicked)
     32 
     33     ####################################################################################################################
     34     # 分辨率调整
     35     ####################################################################################################################
     36     # 分辨率调整-源目录-浏览
     37     def reslotion_src_view_btn_clicked(self):
     38         directory = QFileDialog.getExistingDirectory(self, 'Src')
     39         self.reslotion_src_le.setText(directory)
     40 
     41     # 分辨率调整-目标目录-浏览
     42     def reslotion_dst_view_btn_clicked(self):
     43         directory = QFileDialog.getExistingDirectory(self, 'Dst')
     44         self.reslotion_dst_le.setText(directory)
     45 
     46     # 分辨率调整-确定
     47     def reslotion_submit_btn_clicked(self):
     48         self.reslotion_submit_btn.setEnabled(False)
     49         t = threading.Thread(target=self.fact_convert_resolution)
     50         t.start()
     51 
     52     # 分辨率调整-线程工作函数
     53     def fact_convert_resolution(self):
     54         try:
     55             # 删除已经存在转换目标目录
     56             wdire = self.reslotion_dst_le.text()
     57             wdire = os.path.join(wdire, os.path.split(self.reslotion_src_le.text())[-1] + '_convert')
     58             wdire = wdire.replace('\', '/')
     59             if os.path.exists(wdire): shutil.rmtree(wdire)
     60             wdire = shutil.copytree(self.reslotion_src_le.text(), wdire)
     61             rw, rh = float(self.reslotion_dstw_le.text()) / float(self.reslotion_srcw_le.text()), 
     62                      float(self.reslotion_dsth_le.text()) / float(self.reslotion_srch_le.text())
     63             self.conver_resolution(wdire, rw, rh)
     64         except: QMessageBox.information(self, 'Error', '请检查输入是否完整.')
     65         self.output_lw_signal.emit('全部转换工作已经完成.')
     66         self.reslotion_submit_btn.setEnabled(True)
     67 
     68     ####################################################################################################################
     69     # 偏移值调整
     70     ####################################################################################################################
     71     # 偏移值调整-序列文件夹-浏览
     72     def offset_view_btn_clicked(self):
     73         directory = QFileDialog.getExistingDirectory(self, 'Sequence')
     74         self.offset_dire_le.setText(directory)
     75 
     76     # 偏移值调整-确定
     77     def offset_submit_btn_clicked(self):
     78         dire = self.offset_dire_le.text()
     79         if dire == None:
     80             QMessageBox.information(self, 'Error', '参数错误.')
     81             return
     82         if os.path.isdir(dire) == False:
     83             QMessageBox.information(self, 'Error', '参数错误.')
     84             return
     85         # 遍历文件夹下的图片文件
     86         self.offset_submit_btn.setEnabled(False)
     87         # args是一个数组变量参数,如果只传递一个值,
     88         # 就只需要i, 如果需要传递多个参数,那么还可以继续传递下去其他的参数,
     89         # 其中的逗号不能少,少了就不是数组了,就会出错
     90         t = threading.Thread(target=self.offset_submit_worker, args=(dire,))
     91         t.start()
     92 
     93     # 偏移值调整-线程工作函数
     94     def offset_submit_worker(self, dire):
     95         if not self.offset_pixel_le.text(): pixel = int(self.offset_pixel_le.placeholderText())
     96         else: pixel = int(self.offset_pixel_le.text())
     97         if not self.offset_meter_le.text(): meter = int (self.offset_meter_le.placeholderText())
     98         else: meter = int(self.offset_meter_le.text())
     99         if not self.offset_ltx_le.text(): ltx = float(self.offset_ltx_le.placeholderText())
    100         else: ltx = float(self.offset_ltx_le.text())
    101         if not self.offset_lty_le.text(): lty = float(self.offset_lty_le.placeholderText())
    102         else: lty = float(self.offset_lty_le.text())
    103         # 计算偏移像素
    104         offx = int(ltx * pixel / meter)
    105         offy = int(lty * pixel / meter)
    106         # print(offx, offy)
    107         # self.output_lw_signal.emit('will process ' + dire)
    108         try:
    109             n = 0
    110             for file in os.listdir(dire):
    111                 fn = os.path.join(dire, file)
    112                 fn = fn.replace('\', '/')
    113                 # self.output_lw_signal.emit('->' + fn)
    114                 if os.path.isfile(fn):
    115                     # 分割文件名与文件扩展名
    116                     f,e = os.path.splitext(fn)
    117                     # 只针对带透明通道的图片
    118                     exts = ['.png', '.psd']
    119                     if e in exts:
    120                         s = Image.open(fn)
    121                         sw,sh = s.size
    122                         # 调整宽和高为64的倍数
    123                         # rw = math.ceil(sw/64.0)
    124                         # rh = math.ceil(sh/64.0)
    125                         # dw = 64 * rw
    126                         dw = sw + abs(int(2 * offx))
    127                         if (dw-sw)%2 == 1: dw+=1
    128                         # dh = 64 * rh
    129                         dh = sh + abs(int(2 * offy))
    130                         if (dh-sh)%2 ==1: dh+=1
    131                         # print(sw, sh, dw, dh, rw, rh)
    132                         # 创建一个容器图片
    133                         ns = Image.new('RGBA', (dw,dh))
    134                         # 原图无偏移区域
    135                         bx = int((dw-sw)/2) + offx
    136                         by = int((dh-sh)/2) + offy
    137                         # box = (bx,by,sw+bx,sh+by)
    138                         # 这里需要源图片尺寸要保持不变
    139                         # ns.paste(s,box)
    140                         ns.paste(s, (bx,by))
    141                         ns.save(fn)
    142                         ns.close()
    143                         s.close()
    144                         # 顺带改名
    145                         if self.rename_ckb.isChecked():
    146                             nf = os.path.join(os.path.split(fn)[0], '%04d'%(n) + e)
    147                             n = n + 1
    148                             os.rename(fn, nf)
    149                             fn = nf
    150                         self.output_lw_signal.emit('->' + fn)
    151         except TypeError: print('Error', 'TypeError.')
    152         except IOError: print('Error', 'IOError.')
    153         except FileNotFoundError: print('Error', 'FileNotFoundError.')
    154         self.offset_submit_btn.setEnabled(True)
    155         self.output_lw_signal.emit('全部偏移工作已经完成.')
    156 
    157     # arg-目录 rw-宽度比值 rh-高度比值
    158     def conver_resolution(self, arg, rw, rh):
    159         if not os.path.isdir(arg) and not os.path.isfile(arg): return False
    160         if os.path.isfile(arg):
    161             # 分割出目录与文件
    162             _strs = os.path.split(arg)
    163             # 分割文件名与文件扩展名
    164             _strs = _strs[-1].split('.')
    165             exts = ['bmp', 'jpeg', 'jpg', 'png', 'psd']
    166             if _strs[-1] in exts:
    167                 im = Image.open(arg)
    168                 w,h = im.size
    169                 rim = im.resize((int(w*rw),int(h*rh)), Image.ANTIALIAS)
    170                 rim.save(arg)
    171                 self.output_lw_signal.emit('->' + arg)
    172                 im.close()
    173                 rim.close()
    174         elif os.path.isdir(arg):
    175             for dire in os.listdir(arg):
    176                 # 向目录的下一级目录执行操作
    177                 narg = os.path.join(arg, dire)
    178                 narg = narg.replace('\', '/')
    179                 self.conver_resolution(narg, rw, rh)
    180 
    181     ####################################################################################################################
    182     # 尺寸调整
    183     ####################################################################################################################
    184     # 尺寸调整-目录-浏览
    185     def size_view_btn_clicked(self):
    186         directory = QFileDialog.getExistingDirectory(self, '选择需要调整尺寸的目录')
    187         self.size_directory_le.setText(directory)
    188 
    189     # 尺寸调整-确定
    190     def size_submit_btn_clicked(self):
    191         directory = self.size_directory_le.text()
    192         if not directory:
    193             self.output_lw_signal.emit('参数输入不完整.')
    194             return
    195         if not self.size_width_le.text():
    196             self.output_lw_signal.emit('参数输入不完整.')
    197             return
    198         else: self.size_setw = int(self.size_width_le.text())
    199         if not self.size_height_le.text():
    200             self.output_lw_signal.emit('参数输入不完整.')
    201             return
    202         else: self.size_seth = int(self.size_height_le.text())
    203 
    204         self.size_submit_btn.setEnabled(False)
    205         t = threading.Thread(target=self.size_submit_btn_callback, args=(directory,))
    206         t.start()
    207 
    208     # 尺寸调整-线程工作函数
    209     def size_submit_btn_callback(self, directory):
    210         self.output_lw_signal.emit('start process images.')
    211         for file in os.listdir(directory):
    212             compath = os.path.join(directory, file)
    213             compath = compath.replace('\', '/')
    214             if os.path.isfile(compath):
    215                 # 分割出文件名与扩展名
    216                 f,e = os.path.splitext(compath)
    217                 # 确定操作的文件为图片
    218                 if e in ['.png', '.psd', '.jpg', '.jpeg','.bmp']:
    219                     im = Image.open(compath)
    220                     imw,imh = im.size
    221                     x = abs(int((imw - self.size_setw) / 2))
    222                     y = abs(int((imh - self.size_seth) / 2))
    223                     if im.size >= (self.size_setw, self.size_seth):
    224                         newim = im.crop((x, y, x + self.size_setw, y + self.size_seth))
    225                     else:
    226                         newim = Image.new('RGBA', (self.size_setw, self.size_seth))
    227                         newim.paste(im, (x, y))
    228                     newim.save(compath)
    229                     newim.close()
    230                     im.close()
    231                     self.output_lw_signal.emit(compath + ' process success.')
    232         self.size_submit_btn.setEnabled(True)
    233         self.output_lw_signal.emit('all process is completed.')
    234 
    235     ####################################################################################################################
    236     # comm
    237     ####################################################################################################################
    238     def output_lw_signal_proc(self, arg):
    239         self.output_lw.addItem(arg)
    240         self.output_lw.scrollToBottom()
    241 
    242     def reslotion_submit_signal_proc(self):
    243         self.reslotion_submit_btn.setEnabled(True)
    View Code
    • 程序入口
     1 # coding=utf-8
     2 import sys
     3 from PyQt5.QtCore import *
     4 from PyQt5.QtWidgets import *
     5 from IProcessingDialogWrap import IPDW
     6 
     7 if __name__ == '__main__':
     8     app = QApplication(sys.argv)
     9     ip = IPDW()
    10     ip.show()
    11     sys.exit(app.exec_())
  • 相关阅读:
    Unity3d TweenPosition.Begin()的使用浅析
    Unity3D 代理的使用及获取两个碰撞器的碰撞点
    Unity3D 调用GPS位置服务实现代码
    在控制台中输入msqyl一直报ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost'错误
    eclipse 提示错误The method of type must override a superclass method 的解决办法
    Linux高级命令
    Centos7安装及配置
    Linux基本命令
    多线程
    java总结
  • 原文地址:https://www.cnblogs.com/linxmouse/p/7500887.html
Copyright © 2011-2022 走看看