最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python+pyqt5實現(xiàn)圖片批量縮放工具

 更新時間:2019年03月18日 10:11:36   作者:daxuewei  
這篇文章主要為大家詳細介紹了Python+pyqt5實現(xiàn)圖片批量縮放工具,具有一定的參考價值,感興趣的小伙伴們可以參考一下

批量修改圖片大小好像用PS也可以,不過我不會,程序猿就用程序來解決。
這段時間學(xué)了下Python,很強大,之前一些不知道怎么處理的東西在Python里面都能找到解決方法。

工具界面如下圖

這個工具需要用到第三方庫 Pillow 和 Pyqt5,可通過命令行安裝。

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 設(shè)置新尺寸
    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"設(shè)置縮放值" )
    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"設(shè)置高度" )
    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"設(shè)置寬度" )
    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"設(shè)置縮放值", u"輸入錯誤" )
      else:
        self.m_scale = scale
        self.refresh_setting(0)

  #根據(jù)高度的縮放比例等比例縮放
  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"設(shè)置高度", u"輸入錯誤" )
      else:
        self.m_height = height
        self.refresh_setting(2)

  #根據(jù)寬度的縮放比例等比例縮放
  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"設(shè)置寬度", 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"文件夾不能設(shè)置寬度" )
        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"文件夾不能設(shè)置高度" )
        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_() )

整個工具比較簡陋,能用就好。有什么不正確的地方請指出。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python分布式編程實現(xiàn)過程解析

    python分布式編程實現(xiàn)過程解析

    這篇文章主要介紹了python分布式編程實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • np.ones的使用小結(jié)

    np.ones的使用小結(jié)

    本文主要介紹了np.ones的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 舉例講解Python中的死鎖、可重入鎖和互斥鎖

    舉例講解Python中的死鎖、可重入鎖和互斥鎖

    這篇文章主要介紹了舉例講解Python中的死鎖、可重入鎖和互斥鎖,盡管線程編程方面Python的GIL問題老生常談...需要的朋友可以參考下
    2015-11-11
  • python實現(xiàn)對指定輸入的字符串逆序輸出的6種方法

    python實現(xiàn)對指定輸入的字符串逆序輸出的6種方法

    這篇文章主要介紹了python實現(xiàn)對指定輸入的字符串逆序輸出的6種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python之js逆向功能演示詳解

    python之js逆向功能演示詳解

    這篇文章主要為大家介紹了python之js逆向功能演示詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • python PyTorch預(yù)訓(xùn)練示例

    python PyTorch預(yù)訓(xùn)練示例

    這篇文章主要介紹了python PyTorch預(yù)訓(xùn)練示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • python os.path模塊使用方法介紹

    python os.path模塊使用方法介紹

    os.path 模塊是系統(tǒng)路徑操作模塊,但實際的原理可以把它認為是處理包含斜杠("/")和反斜杠("\")字符串的模塊,其中,斜杠("/")是 linux 系統(tǒng)下的路徑分隔符,和反斜杠("\")是 windows 系統(tǒng)下的路徑分隔符
    2022-08-08
  • python實現(xiàn)文件快照加密保護的方法

    python實現(xiàn)文件快照加密保護的方法

    這篇文章主要介紹了python實現(xiàn)文件快照加密保護的方法,涉及Python文件加密的技巧,可有效防止文件被篡改,需要的朋友可以參考下
    2015-06-06
  • Django 聚合查詢及使用步驟

    Django 聚合查詢及使用步驟

    本文詳細介紹了Django中聚合查詢的使用方法和步驟,包括aggregate()和annotate()兩種聚合查詢方式,以及F()和Q()查詢的使用場景,文中通過具體代碼示例解釋了如何在Django項目中實現(xiàn)數(shù)據(jù)聚合,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • PyTorch中torch.nn.functional.cosine_similarity使用詳解

    PyTorch中torch.nn.functional.cosine_similarity使用詳解

    在pytorch中可以使用torch.cosine_similarity函數(shù)對兩個向量或者張量計算余弦相似度,這篇文章主要給大家介紹了關(guān)于PyTorch中torch.nn.functional.cosine_similarity使用的相關(guān)資料,需要的朋友可以參考下
    2022-03-03

最新評論

容城县| 莎车县| 于都县| 三河市| 朝阳市| 富顺县| 江孜县| 平谷区| 鄂伦春自治旗| 思茅市| 紫阳县| 莱芜市| 延安市| 赣榆县| 平定县| 垣曲县| 政和县| 扶绥县| 松原市| 延吉市| 泰来县| 阿尔山市| 德阳市| 芦山县| 兴山县| 汉川市| 璧山县| 黄浦区| 阿拉尔市| 民县| 贵南县| 伊春市| 兴安县| 咸宁市| 寻乌县| 盐津县| 常德市| 肥城市| 醴陵市| 昌黎县| 乐平市|