如何使用 python创建图片格式转换器
在本篇博客中,我们将通过一个简单的实例来展示如何使用 wxPython 创建一个图形用户界面(GUI)应用程序,用于将图片从一种格式转换为另一种格式。我们将通过以下几个步骤实现这一目标:
C:\pythoncode\new\imageconverttype.py
- 选择多个
.png文件。 - 选择目标文件类型(例如,
jpeg,gif,png,bmp,webp)。 - 点击“转换”按钮,将选择的文件转换为目标格式。
- 将转换后的文件保存到指定的文件夹中。
全部代码
import wx
import os
from PIL import Imageclass ImageConverter(wx.Frame):def __init__(self, *args, **kw):super(ImageConverter, self).__init__(*args, **kw)self.InitUI()def InitUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 选择文件按钮self.files_button = wx.Button(panel, label="选择图片文件")self.files_button.Bind(wx.EVT_BUTTON, self.on_select_files)# 显示选择的文件列表self.files_list = wx.ListBox(panel, size=(400, 150))# 选择转换后的文件类型self.target_format_choice = wx.Choice(panel, choices=["JPEG", "GIF", "PNG", "BMP", "WEBP"])self.target_format_choice.SetSelection(0) # 默认选择JPEG# 选择保存的文件夹self.output_folder_button = wx.Button(panel, label="选择保存文件夹")self.output_folder_button.Bind(wx.EVT_BUTTON, self.on_select_folder)# 显示选中的保存文件夹路径self.output_folder_text = wx.TextCtrl(panel, size=(400, 25), style=wx.TE_READONLY)# 转换按钮self.convert_button = wx.Button(panel, label="转换")self.convert_button.Bind(wx.EVT_BUTTON, self.on_convert)# 布局vbox.Add(self.files_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.files_list, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.target_format_choice, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.output_folder_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.output_folder_text, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.convert_button, flag=wx.EXPAND | wx.ALL, border=10)panel.SetSizer(vbox)self.SetSize((500, 400))self.SetTitle('图片格式转换器')self.Centre()self.Show(True)def on_select_files(self, event):with wx.FileDialog(self, "选择图片文件", wildcard="PNG files (*.png)|*.png",style=wx.FD_OPEN | wx.FD_MULTIPLE) as dlg:if dlg.ShowModal() == wx.ID_OK:paths = dlg.GetPaths()self.files_list.SetItems(paths)def on_select_folder(self, event):with wx.DirDialog(self, "选择保存文件夹", style=wx.DD_DEFAULT_STYLE) as dlg:if dlg.ShowModal() == wx.ID_OK:self.output_folder_text.SetValue(dlg.GetPath())def on_convert(self, event):# 获取选择的文件路径和目标格式selected_files = self.files_list.GetStrings()target_format = self.target_format_choice.GetStringSelection().lower()output_folder = self.output_folder_text.GetValue()if not selected_files or not output_folder:wx.MessageBox("请选择文件和目标文件夹", "错误", wx.ICON_ERROR)returnif target_format not in ["jpeg", "gif", "png", "bmp", "webp"]:wx.MessageBox("无效的目标格式", "错误", wx.ICON_ERROR)return# 转换每个文件for file in selected_files:try:# 打开图片with Image.open(file) as img:# 确定输出文件名base_name = os.path.splitext(os.path.basename(file))[0]output_path = os.path.join(output_folder, f"{base_name}.{target_format}")# 保存为目标格式img.convert("RGB").save(output_path, target_format.upper())wx.MessageBox(f"转换成功: {output_path}", "完成", wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f"转换失败: {file}\n错误: {str(e)}", "错误", wx.ICON_ERROR)if __name__ == '__main__':app = wx.App(False)ImageConverter(None)app.MainLoop()
准备工作
首先,确保你已经安装了 wxPython 和 Pillow(Python Imaging Library)。这两个库将分别用于创建界面和处理图片转换功能。
在命令行中使用 pip 安装:
pip install wxPython Pillow
wxPython:用于创建跨平台的桌面应用程序。Pillow:用于处理图像文件,如打开、转换格式、保存等。
代码实现
接下来,我们将通过代码实现上述功能。
import wx
import os
from PIL import Imageclass ImageConverter(wx.Frame):def __init__(self, *args, **kw):super(ImageConverter, self).__init__(*args, **kw)self.InitUI()def InitUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# 选择文件按钮self.files_button = wx.Button(panel, label="选择图片文件")self.files_button.Bind(wx.EVT_BUTTON, self.on_select_files)# 显示选择的文件列表self.files_list = wx.ListBox(panel, size=(400, 150))# 选择转换后的文件类型self.target_format_choice = wx.Choice(panel, choices=["JPEG", "GIF", "PNG", "BMP", "WEBP"])self.target_format_choice.SetSelection(0) # 默认选择JPEG# 选择保存的文件夹self.output_folder_button = wx.Button(panel, label="选择保存文件夹")self.output_folder_button.Bind(wx.EVT_BUTTON, self.on_select_folder)# 显示选中的保存文件夹路径self.output_folder_text = wx.TextCtrl(panel, size=(400, 25), style=wx.TE_READONLY)# 转换按钮self.convert_button = wx.Button(panel, label="转换")self.convert_button.Bind(wx.EVT_BUTTON, self.on_convert)# 布局vbox.Add(self.files_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.files_list, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.target_format_choice, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.output_folder_button, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.output_folder_text, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(self.convert_button, flag=wx.EXPAND | wx.ALL, border=10)panel.SetSizer(vbox)self.SetSize((500, 400))self.SetTitle('图片格式转换器')self.Centre()self.Show(True)def on_select_files(self, event):with wx.FileDialog(self, "选择图片文件", wildcard="PNG files (*.png)|*.png",style=wx.FD_OPEN | wx.FD_MULTIPLE) as dlg:if dlg.ShowModal() == wx.ID_OK:paths = dlg.GetPaths()self.files_list.SetItems(paths)def on_select_folder(self, event):with wx.DirDialog(self, "选择保存文件夹", style=wx.DD_DEFAULT_STYLE) as dlg:if dlg.ShowModal() == wx.ID_OK:self.output_folder_text.SetValue(dlg.GetPath())def on_convert(self, event):# 获取选择的文件路径和目标格式selected_files = self.files_list.GetStrings()target_format = self.target_format_choice.GetStringSelection().lower()output_folder = self.output_folder_text.GetValue()if not selected_files or not output_folder:wx.MessageBox("请选择文件和目标文件夹", "错误", wx.ICON_ERROR)returnif target_format not in ["jpeg", "gif", "png", "bmp", "webp"]:wx.MessageBox("无效的目标格式", "错误", wx.ICON_ERROR)return# 转换每个文件for file in selected_files:try:# 打开图片with Image.open(file) as img:# 确定输出文件名base_name = os.path.splitext(os.path.basename(file))[0]output_path = os.path.join(output_folder, f"{base_name}.{target_format}")# 保存为目标格式img.convert("RGB").save(output_path, target_format.upper())wx.MessageBox(f"转换成功: {output_path}", "完成", wx.ICON_INFORMATION)except Exception as e:wx.MessageBox(f"转换失败: {file}\n错误: {str(e)}", "错误", wx.ICON_ERROR)if __name__ == '__main__':app = wx.App(False)ImageConverter(None)app.MainLoop()
代码解析
-
界面设计:使用
wx.Panel和wx.BoxSizer来构建应用的布局。- 选择文件按钮:通过
wx.FileDialog让用户选择多个.png文件。 - 目标文件类型选择:使用
wx.Choice让用户选择目标格式(如 JPEG, GIF, PNG, BMP, WEBP)。 - 保存文件夹选择:通过
wx.DirDialog让用户选择一个文件夹来保存转换后的文件。 - 转换按钮:点击按钮后,将所选文件转换并保存到指定文件夹。
- 选择文件按钮:通过
-
图片转换:使用
Pillow库来处理图片的转换。我们通过Image.open()打开图片,调用convert("RGB")方法以确保图像可以转换为目标格式,然后调用save()保存为新的格式。 -
错误处理:如果文件转换失败或用户未选择文件、文件夹等,程序会弹出错误消息框,提示用户。
运行和测试
- 启动程序后,点击 “选择图片文件” 按钮,选择要转换的
.png文件。 - 选择目标格式(如
jpeg,gif,bmp等)。 - 点击 “选择保存文件夹” 按钮,选择保存文件的目录。
- 最后,点击 “转换” 按钮,程序会将选择的图片转换为目标格式,并保存在指定文件夹中。
结果如下

相关文章:
如何使用 python创建图片格式转换器
在本篇博客中,我们将通过一个简单的实例来展示如何使用 wxPython 创建一个图形用户界面(GUI)应用程序,用于将图片从一种格式转换为另一种格式。我们将通过以下几个步骤实现这一目标: C:\pythoncode\new\imageconvertty…...
命令行之巅:Linux Shell编程的至高艺术(上)
文章一览 前言一、shell概述1.1 shell的特点和类型1.1.1 **shell的特点:**1.1.2 常用shell类型 1.2 shell脚本的建立和执行1.2.1 建立shell脚本1.2.2 执行shell脚本的方式1.2.3 shell程序实例 二、shell变量与算数运算2.1 简单shell变量2.1.1 简单变量定义和赋值2.1…...
【gulp】gulp 的基本使用
gulp 是一个基于node的自动化打包构建工具,前端开发者可以使用它来处理常见任务: 创建项目 进入项目 npm init -ynpm i gulp -g (使用命令 gulp)npm i gulp -D # 开发依赖(前端工具都是开发依赖 本地安装 代…...
Linux 下处理 ^M 字符的最佳实践
Linux 下处理 ^M 字符的最佳实践 一、快速解决方案 按照优先级排序的三种解决方案: 1. 使用 dos2unix(推荐) # 安装 sudo apt-get install dos2unix # Ubuntu/Debian sudo yum install dos2unix # CentOS# 使用 dos2unix 文件名2. 使用 sed sed...
【优选算法】—复写零(双指针算法)
云边有个稻草人-CSDN博客 每天至少一道算法题,接着干,以额现在的实力想完成那个目标确实难。算法题确实烧脑,挺煎熬的,但脑子烧多了是不是就该好些了?。。。 记得那句话,必须有为成功付出代价的决心&#x…...
2024国赛A问题三和四
问题三 最小螺距单目标优化模型的建立 问题二考虑了在螺距固定的条件下计算舞龙队盘入的终止时间,问题三在第二问的基础提出了改变螺距的要求,即求解在螺距最小为多少时,龙头前把手能够沿着相应的螺线盘入到调头空间的边界。故可将其转换为…...
asp.net 高校学生勤工俭学系统设计与实现
博主介绍:专注于Java(springboot ssm 等开发框架) vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…...
《计算机组成及汇编语言原理》阅读笔记:p116-p120
《计算机组成及汇编语言原理》学习第 7 天,p116-p120 总结,总计 5 页。 一、技术总结 1.CPU优化 (1)increase overall performance number 例如:16位电脑提升到32位电脑。 (2)multiprocessing One way to make computers more useful i…...
C# OpenCvSharp DNN 卡证检测矫正
目录 说明 效果 模型 项目 代码 下载 参考 说明 源码地址:https://modelscope.cn/models/iic/cv_resnet_carddetection_scrfd34gkps 在实人认证、文档电子化等场景中需要自动化提取卡证的信息,以便进一步做录入处理。这类场景通常存在两类问题&…...
Spring Boot 中 Map 的最佳实践
在Spring Boot中使用Map时,请遵循以下最佳实践: 1.避免在Controller中 直接使用Map。应该使用RequestBody 接收-个DTO对象或者 RequestParam接收参数,然后在Service中处 理Map。 2.避免在Service中 直接使用原始的Map。应该使用Autowired 注入-个专门…...
J-LangChain - 智能链构建
介绍 j-langchain是一个Java版的LangChain开发框架,旨在简化和加速各类大模型应用在Java平台的落地开发。它提供了一组实用的工具和类,使得开发人员能够更轻松地构建类似于LangChain的Java应用程序。 依赖 Maven <dependency><groupId>i…...
开源低代码平台-Microi吾码 打印引擎使用
引言 在开发中,会遇到很多记录的表单数据需要下载打印下来使用到线下各种应用场景中。在传统的方法中可能是需要先导出数据,然后将数据填入word表格中在打印下来。 但Microi吾码提供了一项新功能,便是打印引擎。打印引擎即可在线设计…...
【MySQL】索引 面试题
文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构,通过维护特定查找算法的数据结构(如B树),以某种方式引用数据…...
【高阶数据结构】AVL树
AVL树 1.AVL的概念2.AVL树的实现1.AVL树的结构2.AVL树的插入1.更新平衡因子2.旋转1.右单旋2.左单旋3.左右双旋4.右左双旋 3.AVL树的查找4.AVL树的平衡检测5.AVL树的性能分析6.AVL树的删除 3.总代码1.AVLTree.h2.Test.cpp 1.AVL的概念 AVL树是最先发明的自平衡⼆叉查找树&#…...
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
Spring框架是一个非常流行的应用程序框架,它通过控制反转(IoC)和依赖注入(DI)来简化企业级应用的开发。Spring容器是其核心部分,负责管理对象的创建、配置和生命周期。在Spring中,XML配置是一种…...
docker mysql5.7安装
一.更改 /etc/docker/daemon.json sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https:/…...
HDR视频技术之十一:HEVCH.265 的 HDR 编码方案
前文我们对 HEVC 的 HDR 编码优化技术做了介绍,侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案, 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特,一般的 HDR 信号倾向于使用 10…...
最新的强大的文生视频模型Pyramid Flow 论文阅读及复现
《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址:2410.05954https://arxiv.org/pdf/2410.05954 项目地址: jy0205/Pyramid-Flow: 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…...
Effective C++ 条款 11:在 `operator=` 中处理“自我赋值”
文章目录 条款 11:在 operator 中处理“自我赋值”核心问题示例:使用地址比较示例:copy-and-swap 技术设计建议总结 条款 11:在 operator 中处理“自我赋值” 核心问题 自我赋值风险 如果赋值操作符没有处理自我赋值(…...
19、鸿蒙学习——配置HDC命令 环境变量
一、下载Command Line Tools 可参考上篇《鸿蒙学习——配置OHPM、hvigor环境变量》 二、配置hdc环境变量 hdc命令行工具用于HarmonyOS应用/元服务调试所需的工具,该工具存放在命令行工具自带的sdk下的toolchains目录中。为方便使用hdc命令行工具,请将…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
