Python学习笔记——给图片格式转换器做个GUI

用wxPython写一个简单的图片格式转换器,把遇到的一些问题记录下来。

开发环境:win10、Python3.8.10、wxPython4.1.1

直接上代码

import os
import wx
from PIL import Image, ImageOps, ImageFile# 支持的图片文件格式(扩展名)
IMAGE_FILE_EXTS = ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.ico', '.tif', '.webp']# 遍历文件,将所有文件的路径放入一个列表里
def file_walk(root_path):file_list = []for dirPath, dirNames, fileNames in os.walk(root_path):for fileName in fileNames:ext = os.path.splitext(fileName)[1]  # 分离出文件扩展名if ext in IMAGE_FILE_EXTS:  # 根据文件扩展名判断是不是图片文件,如果是添加到列表中filePath = os.path.join(dirPath, fileName)  # 用文件目录和文件名拼接出完整的文件绝对路径file_list.append(filePath)  # 添加到文件列表return file_listclass MainFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, wx.ID_ANY, "图片格式转换器", size=(550, 200))self.extCombobox = None  # 文件扩展名下拉框控件self.srcPathTextCtrl = None  # 图片输入路径文本框控件self.dstPathTextCtrl = None  # 图片输出路径文件框控件panel = wx.Panel(self)font = panel.GetFont()  # 获取当前窗口字体font.PointSize += 1  # 字号加1panel.SetFont(font)  # 设置字体为修改后的字体# 创建一个布局管理器panelSizer = wx.BoxSizer(wx.VERTICAL)iPanel = self.CreateInputPanel(panel)  # 创建输入相关控件面板oPanel = self.CreateOutputPanel(panel)  # 创建输出相关控件面板cPanel = self.CreateConvertPanel(panel)  # 创建转换相关控件面板# 添加到布局管理器panelSizer.Add(iPanel, 0, wx.EXPAND | wx.TOP, 10)panelSizer.Add(oPanel, 0, wx.EXPAND | wx.TOP, 10)panelSizer.Add(cPanel, 0, wx.EXPAND | wx.TOP, 10)# 创建提示信息面板self.tip = wx.StaticText(panel, wx.ID_ANY, "")panelSizer.Add(self.tip, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, 10)panel.SetSizer(panelSizer)# 创建输入相关控件面板def CreateInputPanel(self, panel):inputPanel = wx.Panel(panel)inputSizer = wx.BoxSizer(wx.HORIZONTAL)inputPanel.SetSizer(inputSizer)label = wx.StaticText(inputPanel, wx.ID_ANY, "图片输入路径:")inputSizer.Add(label, 0, wx.ALIGN_CENTER | wx.LEFT, 10)self.srcPathTextCtrl = wx.TextCtrl(inputPanel)self.srcPathTextCtrl.SetEditable(False)inputSizer.Add(self.srcPathTextCtrl, 1, wx.EXPAND | wx.RIGHT, 5)browseButton = wx.Button(inputPanel, wx.ID_ANY, '浏览...')browseButton.Bind(wx.EVT_BUTTON, self.ChangeSrcDirButtonEvent)inputSizer.Add(browseButton, 0, wx.RIGHT, 10)return inputPanel# 创建输出相关控件面板def CreateOutputPanel(self, panel):outputPanel = wx.Panel(panel)outputSizer = wx.BoxSizer(wx.HORIZONTAL)outputPanel.SetSizer(outputSizer)label = wx.StaticText(outputPanel, wx.ID_ANY, "图片输出路径:")outputSizer.Add(label, 0, wx.ALIGN_CENTER | wx.LEFT, 10)self.dstPathTextCtrl = wx.TextCtrl(outputPanel)self.dstPathTextCtrl.SetEditable(False)outputSizer.Add(self.dstPathTextCtrl, 1, wx.EXPAND | wx.RIGHT, 5)browseButton = wx.Button(outputPanel, wx.ID_ANY, '浏览...')browseButton.Bind(wx.EVT_BUTTON, self.ChangeDstDirButtonEvent)outputSizer.Add(browseButton, 0, wx.RIGHT, 10)return outputPanel# 创建转换相关控件面板def CreateConvertPanel(self, panel):cPanel = wx.Panel(panel)cSizer = wx.BoxSizer(wx.HORIZONTAL)cPanel.SetSizer(cSizer)label = wx.StaticText(cPanel, wx.ID_ANY, '图片输出格式:')cSizer.Add(label, 0, wx.ALIGN_CENTER | wx.LEFT, 10)self.extCombobox = wx.ComboBox(cPanel, wx.ID_ANY, "", (-1, -1), (60, -1), IMAGE_FILE_EXTS, wx.CB_DROPDOWN)self.extCombobox.SetSelection(0)cSizer.Add(self.extCombobox, 0)cSizer.AddSpacer(10)browseButton = wx.Button(cPanel, wx.ID_ANY, '转换格式')browseButton.Bind(wx.EVT_BUTTON, self.ConvertButtonEvent)cSizer.Add(browseButton, 0, wx.RIGHT, 10)return cPanel# 点击图片输入路径浏览按钮,触发此方法,打开文件选择对话框,选择目录并返回该目录路径地址def ChangeSrcDirButtonEvent(self, event):dialog = wx.DirDialog(self, "选择图片目录", os.getcwd(), wx.DD_DEFAULT_STYLE)if dialog.ShowModal() == wx.ID_OK:dirPath = dialog.GetPath()self.srcPathTextCtrl.SetValue(dirPath)if self.dstPathTextCtrl.GetValue() == '':self.dstPathTextCtrl.SetValue(dirPath)# 点击图片输出路径浏览按钮,触发此方法,打开文件选择对话框,选择目录并返回该目录路径地址def ChangeDstDirButtonEvent(self, event):dialog = wx.DirDialog(self, "选择图片目录", os.getcwd(), wx.DD_DEFAULT_STYLE)if dialog.ShowModal() == wx.ID_OK:dirPath = dialog.GetPath()self.dstPathTextCtrl.SetValue(dirPath)# 点击转换格式按钮,触发此方法,获取图片输入输出路径和图片输出类型,转换图片。def ConvertButtonEvent(self, event):srcPath = self.srcPathTextCtrl.GetValue()dstPath = self.dstPathTextCtrl.GetValue()if srcPath == '':wx.MessageBox('请选择图片输入路径', '消息', wx.OK | wx.ICON_INFORMATION)returnif dstPath == '':wx.MessageBox('请选择图片输出路径', '消息', wx.OK | wx.ICON_INFORMATION)returnext = self.extCombobox.GetValue()file_list = file_walk(srcPath)for srcImagePath in file_list:image = Image.open(srcImagePath)image = ImageOps.exif_transpose(image)srcImageName = os.path.split(srcImagePath)[1]dstImageName = os.path.splitext(srcImageName)[0] + extdstImagePath = os.path.join(dstPath, dstImageName)image.save(dstImagePath)self.tip.SetLabel('正在转换:%s' % srcImagePath)self.tip.SetLabel('转换完成')if __name__ == '__main__':app = wx.App(0)frame = MainFrame(None)frame.CenterOnScreen()frame.Show(True)app.MainLoop()

运行起来

我们来转换一批图片来测试一下

卡在这里不动了,看一下报了什么错

检查一下这张图片

这张图片是0字节的,我们在处理图片之前判断一下图片

file_list = file_walk(srcPath)
for srcImagePath in file_list:print(srcImagePath)if os.path.getsize(srcImagePath) == 0:continueimage = Image.open(srcImagePath)image = ImageOps.exif_transpose(image)srcImageName = os.path.split(srcImagePath)[1]dstImageName = os.path.splitext(srcImageName)[0] + extdstImagePath = os.path.join(dstPath, dstImageName)image.save(dstImagePath)self.tip.SetLabel('正在转换:%s' % srcImagePath)

再来运行一下

继续检查图片

对于图片损坏的问题,无法处理。但是不能让程序中止,还要完成后面图片的转换。我们需要捕捉异常,并继续循环。

file_list = file_walk(srcPath)
for srcImagePath in file_list:print(srcImagePath)if os.path.getsize(srcImagePath) == 0:continuetry:image = Image.open(srcImagePath)image = ImageOps.exif_transpose(image)srcImageName = os.path.split(srcImagePath)[1]dstImageName = os.path.splitext(srcImageName)[0] + extdstImagePath = os.path.join(dstPath, dstImageName)image.save(dstImagePath)self.tip.SetLabel('正在转换:%s' % srcImagePath)except Exception as e:print(e)continueself.tip.SetLabel('转换完成')

图片批量转换完成。

下一章节我们将测试批量处理大图片,使用多线程解决UI卡死的问题。

Python学习笔记——给图片格式转换器做个GUI相关推荐

  1. Matlab 图像处理入门学习笔记—1.图片格式转换

    前言:作为一个编程思维极弱的小白,就算是matlab的学习也稍有困难.但也想学好自己选择的路.从最简单的开始,记录学习,也算监督自己. 今天的笔记是图片格式转换,废话不说,直接上代码: a=512; ...

  2. Python学习笔记:Flask-Migrate基于model做upgrade的基本原理

    1)flask-migrate的官网:https://flask-migrate.readthedocs.io/en/latest/  2)获取帮助,在pycharm的控制台中输入 flask db ...

  3. Python学习笔记(迭代、模块扩展、GUI 、编码处理等)

    PythonIDLE中的编码处理 http://www.tuicool.com/articles/NbyEBr 原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来 ...

  4. Python学习笔记:爬取网页图片

    Python学习笔记:爬取网页图片 上次我们利用requests与BeautifulSoup爬取了豆瓣<下町火箭>短评,这次我们来学习爬取网页图片. 比如想爬取下面这张网页的所有图片.网址 ...

  5. Python学习笔记:使用PIL批量合成jpg+png图片,用于水印、合并图片,生成YOLO数据集+标注数据等等

    [Python学习笔记] 使用PIL,批量合成jpg+png图片,用于水印.合并图片,生成YOLO数据集+标注数据等等 起因:在了解很多关于YOLOv5的相关内容,于是尝试着去训练自己的游戏目标检测模 ...

  6. python笔记图片_【Python教程】雨痕 的《Python学习笔记》(附脑图)

    更多 近日,在某微博上看到有人推荐了这本作者是 雨痕 的<Python学习笔记>,从github上下载下来看了下,确实很不错. 注意,这本学习笔记不适合Python新手学习. 从目录上看, ...

  7. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  8. OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并

    OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...

  9. Python学习笔记:web开发1

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  10. Python学习笔记:SMTP服务器

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

最新文章

  1. Datawhale两岁啦!
  2. 59 Celery架构
  3. 控件不支持html5,javascript – HTML5视频控件不起作用
  4. IE8无法调试?IE进入不了调试状态
  5. ubuntu 16.04 安装mysql
  6. 云服务器ECS共享标准型S6全新发布, 行业内最具性价比
  7. java将dxf展示在网页_七天串起java技术栈-第四天
  8. python循环输入字符串_Python基础-条件判断、循环、字符串格式化
  9. 计算机科学中抽象的作用,抽象释义
  10. 如何在本地管理和切换多个 github 账号?
  11. hadoop相关问题
  12. 【序列化与反序列化流】
  13. XWindow与GtkWindow的转换
  14. 430.扁平化多级双向链表
  15. atom markdown转换PDF 解决AssertionError: html-pdf: Failed to load PhantomJS module
  16. Java集合框架--学习目标 集合概念 Collection体系集合 Collection接口
  17. nas做服务器虚拟化共享存储,NAS虚拟化的部署及实现解析
  18. labelmx条码打印软件如何批量制作服装吊牌
  19. centos8安装显卡驱动
  20. Threes.js入门篇之2 - Hello World

热门文章

  1. 艺术科技杂志艺术科技杂志社艺术科技编辑部2022年第4期目录
  2. NSIS静默安装VC运行库插件
  3. 赚一辈子的钱,还是一辈子赚钱? 掌握下一个财富分配周期的法则
  4. 一位前端新人的面试经验
  5. 我的日程安排系列问题(区间重叠问题)
  6. 设计师:设计师的知识储备之异形曲面设计 巴洛克、洛可可 设计理论(三角形构图、平衡式构图、三分法构图 、九宫格构图)之详细攻略
  7. 采集商标网的10个经典方法
  8. matlab如何写一个循环,matlab中for循环怎么写
  9. 胸片和CT断层图像是怎么来的?
  10. 高并发设计的技术方案