当前位置: 首页 > news >正文

如何使用 python创建图片格式转换器

在本篇博客中,我们将通过一个简单的实例来展示如何使用 wxPython 创建一个图形用户界面(GUI)应用程序,用于将图片从一种格式转换为另一种格式。我们将通过以下几个步骤实现这一目标:
C:\pythoncode\new\imageconverttype.py

  1. 选择多个 .png 文件。
  2. 选择目标文件类型(例如,jpeg, gif, png, bmp, webp)。
  3. 点击“转换”按钮,将选择的文件转换为目标格式。
  4. 将转换后的文件保存到指定的文件夹中。

全部代码

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()

准备工作

首先,确保你已经安装了 wxPythonPillow(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()

代码解析

  1. 界面设计:使用 wx.Panelwx.BoxSizer 来构建应用的布局。

    • 选择文件按钮:通过 wx.FileDialog 让用户选择多个 .png 文件。
    • 目标文件类型选择:使用 wx.Choice 让用户选择目标格式(如 JPEG, GIF, PNG, BMP, WEBP)。
    • 保存文件夹选择:通过 wx.DirDialog 让用户选择一个文件夹来保存转换后的文件。
    • 转换按钮:点击按钮后,将所选文件转换并保存到指定文件夹。
  2. 图片转换:使用 Pillow 库来处理图片的转换。我们通过 Image.open() 打开图片,调用 convert("RGB") 方法以确保图像可以转换为目标格式,然后调用 save() 保存为新的格式。

  3. 错误处理:如果文件转换失败或用户未选择文件、文件夹等,程序会弹出错误消息框,提示用户。

运行和测试

  • 启动程序后,点击 “选择图片文件” 按钮,选择要转换的 .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开发框架&#xff0c;旨在简化和加速各类大模型应用在Java平台的落地开发。它提供了一组实用的工具和类&#xff0c;使得开发人员能够更轻松地构建类似于LangChain的Java应用程序。 依赖 Maven <dependency><groupId>i…...

开源低代码平台-Microi吾码 打印引擎使用

引言 在开发中&#xff0c;会遇到很多记录的表单数据需要下载打印下来使用到线下各种应用场景中。在传统的方法中可能是需要先导出数据&#xff0c;然后将数据填入word表格中在打印下来。 但Microi吾码提供了一项新功能&#xff0c;便是打印引擎。打印引擎即可在线设计…...

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构&#xff0c;通过维护特定查找算法的数据结构&#xff08;如B树&#xff09;&#xff0c;以某种方式引用数据&#xf…...

【高阶数据结构】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框架是一个非常流行的应用程序框架&#xff0c;它通过控制反转&#xff08;IoC&#xff09;和依赖注入&#xff08;DI&#xff09;来简化企业级应用的开发。Spring容器是其核心部分&#xff0c;负责管理对象的创建、配置和生命周期。在Spring中&#xff0c;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 编码优化技术做了介绍&#xff0c;侧重编码性能的提升。 本章主要阐述 HEVC 中 HDR/WCG 相关的整体编码方案&#xff0c; 包括不同应用场景下的 HEVC 扩展编码技术。 1 背景 HDR 信号一般意味着使用更多比特&#xff0c;一般的 HDR 信号倾向于使用 10…...

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…...

Effective C++ 条款 11:在 `operator=` 中处理“自我赋值”

文章目录 条款 11&#xff1a;在 operator 中处理“自我赋值”核心问题示例&#xff1a;使用地址比较示例&#xff1a;copy-and-swap 技术设计建议总结 条款 11&#xff1a;在 operator 中处理“自我赋值” 核心问题 自我赋值风险 如果赋值操作符没有处理自我赋值&#xff08;…...

19、鸿蒙学习——配置HDC命令 环境变量

一、下载Command Line Tools 可参考上篇《鸿蒙学习——配置OHPM、hvigor环境变量》 二、配置hdc环境变量 hdc命令行工具用于HarmonyOS应用/元服务调试所需的工具&#xff0c;该工具存放在命令行工具自带的sdk下的toolchains目录中。为方便使用hdc命令行工具&#xff0c;请将…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...