基于pyqt5实现一个精美界面heic图片转换器源码+编译好exe程序

QT的学习第四部分 本文介绍Qt与Linux V4L2框架下摄像头及音视频处理实现。基于Qt的QCamera与QCameraViewfinder类可便捷实现预览与拍照,需在pro文件添加multimedia和multimediawidgets插件。通过V4L2框架可深入控制摄像头参数、缓冲队列及图像采集流程,实现高精度视频捕获。结合FFmpeg与mplayer工具,可在Linux下完成音视频播放、格式转换与流媒体处理。整体涵盖从硬件接口到应用层开发的完整技术链路,适用于嵌入式多媒体系统开发。 阅读详情

基于pyqt5实现一个精美界面heic图片转换器源码+编译好exe程序

HEIC 图片转换器

一款基于PyQt5开发的桌面 GUI 工具,用于将 HEIC/HEIF 格式图片批量转换为 JPG 格式。支持拖放操作、批量重命名、元数据保留、质量调节等功能,操作简单、界面友好。

在这里插入图片描述

目录


算法原理

1. HEIC 格式解码

HEIC/HEIF 是苹果设备默认使用的高效图像格式,Python标准库的 Pillow 默认不支持解码。本项目通过 pillow_heif 库的 register_heif_opener() 函数,将 HEIC 解码器注册到Pillow中,使 Image.open() 能够直接读取 HEIC 文件:

from pillow_heif import register_heif_opener
register_heif_opener()
2. 图像转换核心流程

转换过程位于 [ConversionWorker.convert_image](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L154),主要步骤为:

  1. 使用 PIL.Image.open() 打开 HEIC 文件;

  2. 若启用"保留元数据"选项,通过 img._getexif() 读取 EXIF 信息(包含拍摄时间、相机型号、GPS 等);

  3. 调用 img.convert('RGB') 将图像转换为 RGB 色彩模式(JPEG 不支持透明通道);

  4. 使用 img.save(output_path, 'JPEG', quality=..., exif=...) 保存为 JPG,quality 参数控制压缩质量(10-100)。

3.多线程异步处理

为保证转换过程中界面不卡顿,转换任务在独立线程中执行:

  • ImageConverter 作为控制器,负责创建并管理工作线程;

  • ConversionWorker(QThread) 继承自 QThread ,在 run() 方法中遍历文件列表逐个转换;

  • 通过 Qt 信号机制( pyqtSignal )向主线程回传进度、状态、完成结果,实现线程间通信;

  • 单个文件转换失败不会中断整体流程,通过 try/except 捕获异常并记录到控制台。

4. 批量重命名模板引擎

[ConversionSettings.format_filename](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L37) 实现了基于模板变量的文件名生成,支持以下变量:

变量含义示例
{original}原文件名(不含扩展名)IMG_001
{index}序号1
{index:03d}指定位数的序号(此处为 3 位)001
{prefix}用户自定义前缀旅行
{date}当前日期(YYYYMMDD)20260822

序号宽度通过正则表达式 r'\{index(?::0(\d+)d)?\}' 解析提取,支持 {index} 与 {index:0Nd} 两种形式。

5. 拖放与文件扫描
  • DraggableListWidget 继承自 QListWidget ,重写 dragEnterEvent 、 dragMoveEvent 、 dropEvent ,接收拖入的文件 URL;

  • 拖入文件夹时,通过 glob.glob(path, recursive=True) 递归扫描其中所有 .heic 和 .heif 文件;

  • 添加文件时通过集合去重,避免重复添加。

6. 文件冲突处理

[handle_existing_file](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L143) 根据用户设置处理同名文件:

  • 启用"覆盖已存在文件":直接覆盖;

  • 未启用:在文件名后追加 _1 、 _2 等序号直至无冲突。


环境要求

  • 操作系统 :Windows 7 及以上(代码中使用 os.startfile ,为 Windows 专有方法)

  • Python :3.8 及以上

  • 依赖库 :

库名用途
PyQt5GUI 框架
Pillow (PIL)图像处理
pillow_heifHEIC/HEIF 格式解码

安装步骤

  1. 安装 Python :从官方地址下载并安装 Python 3.8+,安装时勾选 “Add Python to PATH”。

  2. 打开命令行 ,切换到项目目录:

    cd c:\Users\Administrator\Downloads\data
    
  3. (可选)创建虚拟环境 :

    python -m venv venv
    venv\Scripts\activate
    
  4. 安装依赖 :

    pip install PyQt5 Pillow pillow_heif
    

运行步骤

  1. 确保已完成上述安装步骤。

  2. 在项目目录下执行:

    python heicconvert.py
    
  3. 程序启动后的操作流程:

    • 添加文件 :点击"选择文件"或"选择文件夹"按钮,或直接将 HEIC 文件拖拽到列表区域;

    • (可选)批量重命名 :在"批量重命名"区域选择命名模式、填写前缀、设置起始序号,点击"预览"查看效果;

    • 设置输出 :选择输出目录,调整 JPG 质量,按需勾选"保留元数据"“覆盖已存在文件”“自动创建日期子文件夹”;

    • 开始转换 :点击"开始转换"按钮,在弹出的确认对话框中点击"Yes"开始;

    • 查看结果 :转换完成后可在弹出的对话框中点击"打开文件夹"快速定位输出文件。


注意事项

  1. 操作系统限制 :代码中的 os.startfile() 仅适用于 Windows,在 macOS/Linux 上点击"打开文件夹"会报错,需改用 subprocess.call(['open', path]) 或 xdg-open 。

  2. HEIC 解码依赖 : pillow_heif 依赖底层 libheif 库,若安装失败,可尝试升级 pip 后重新安装,或从 其官方仓库 获取帮助。

  3. 元数据保留 :仅当原图包含 EXIF 数据且勾选"保留元数据"时才会写入;部分 HEIC 文件可能不含 EXIF,此属正常现象。

  4. 质量与体积 :JPG 质量越高,输出文件越大。一般建议 85-95 即可兼顾质量与体积。

  5. 覆盖文件不可恢复 :勾选"覆盖已存在文件"后,同名原 JPG 将被直接覆盖且无法撤销,请谨慎使用。

  6. 子文件夹命名规则 :勾选"自动创建日期子文件夹"后,会在输出目录下创建形如 HEIC转换_YYYYMMDD_HHMMSS 的子文件夹,用于区分不同批次的转换结果。

  7. 转换过程中请勿关闭程序 :转换进行时"开始转换"按钮会变为禁用状态,若强制关闭窗口可能导致部分文件未完成转换。

  8. 去重逻辑 :同一文件不会被重复添加到列表中,但若通过不同路径访问(如软链接)可能被识别为不同文件。


文件夹结构

data/
├── heicconvert.py    # 主程序源代码(包含全部业务逻辑与 GUI 实现)
├── heicconvert.7z    # 源代码压缩包
└── README.md         # 项目说明文档(本文件)
源代码主要模块说明

[heicconvert.py](file:///c:/Users/Administrator/Downloads/data/heicconvert.py) 单文件结构,按职责划分为以下模块:

类名行号区间职责
ConversionSettings[L20-L69](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L20)转换配置数据类,封装输出路径、质量、重命名模式等参数,并提供文件名格式化方法
ImageConverter[L71-L100](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L71)转换控制器,负责创建输出目录、启动工作线程、转发信号
ConversionWorker[L102-L168](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L102)工作线程(QThread),执行实际的图片转换、进度上报、冲突处理
DraggableListWidget[L170-L205](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L170)支持拖放的列表控件
RenamePatternWidget[L207-L338](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L207)重命名模式配置控件,含预览功能
MainWindow[L340-L995](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L340)主窗口,组织所有 UI 元素与业务逻辑
Application[L997-L1027](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L997)自定义 QApplication,设置应用元数据与全局调色板
main()[L1029-L1038](file:///c:/Users/Administrator/Downloads/data/heicconvert.py#L1029)程序入口

源码地址:https://download.youkuaiyun.com/download/FL1623863129/90010568

利用pyGAM实现广义可加模型(GAM)的实战指南 本文提供了利用pyGAM库实现广义可加模型(GAM)的完整实战指南。通过乳腺癌和房价预测案例,详细讲解了从环境配置、模型构建、核心可视化(部分依赖图)到参数调优(n_splines, lam)的每一步。重点展示了GAM如何平衡模型准确性与可解释性,帮助数据科学家在Python中高效应用这一强大工具。 阅读详情

相关推荐

信息系统项目管理师(高项)重点!

学习高项自己做的笔记

PanJWei的博客 3301

Qt QBuffer 详解:内存缓冲区读写与实战用法

QBuffer 是 Qt 中用于内存缓冲区读写的 QIODevice 实现,可将 QByteArray 作为“文件”进行随机访问。它支持 open()、read()、write()、seek() 等操作,常用于数据序列化(配合 QDataStream)、内存加载图片、适配仅接受 QIODevice* 的 API。使用时需注意:必须先 open(),写后需 seek(0) 才能读取;若传入外部 QByteArray,其生命周期须长于 QBuffer。适用于小到中等规模内存数据处理,大文件应避免使用。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 542

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1267

Qt_03界面类型

Qt的界面类型

u012660296的博客 190

JAVA:Spring Boot 集成 Forest 优雅的 HTTP 客户端

Forest是一个优雅的Java HTTP客户端框架,通过注解式声明简化HTTP接口调用。它支持多HTTP客户端、自动参数绑定、序列化、重试机制和拦截器等功能。本文演示了如何在Spring Boot中集成Forest,包括配置、接口定义和调用示例,还展示了POST请求、文件上传等常见场景。相比传统HTTP客户端,Forest具有声明简洁、功能完善的特点,特别适合微服务调用和第三方API对接,能显著提升开发效率和代码可维护性。

木头 427

SAP 生产订单工序删除状态撤回简介

2、我们在前台对于生产订单的状态一个是在生产订单抬头中的状态,另外一个是针对上面一直在测试的是工序的状态,这个两个状态是前台可见的状态,实际生产订单还有一个组件物料的状态,这个状态是不可见的一个状态。生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配了工序是不应该被删除的。将已领料的工序删除掉,导致异常的发生。当物料已领料会,用户仍然把已分配的物料的工序删除掉,导致后续业务操作过程中产生异常,如下图中所示,0010的工序被打上了删除标识。

我小时候很黑的博客 1940

Qt 内嵌页面能显示、按钮调用桌面功能时报 Qt6WebChannel.dll?查桥接层

Qt 桌面程序里的内嵌 HTML 面板能显示静态内容,但点击“读取本地任务”才报 Qt6WebChannel.dll。先保存构建清单,用脱敏测试任务重现;页面能加载不等于 JavaScript 与 C++ 的桥接层也完整。应先确认准确弹窗,再排查模块和页面脚本。 ## Qt6WebChannel.dll 的来源与桥接组件版本 查看发行包里 Qt6Core.d

2301_78581598的博客 204

STM32 驱动直流无刷电机(BLDC)发声

STM32 驱动直流无刷电机(BLDC)发声

perseverance51博客 3401

【Qt】系统相关:UDP 回显服务器

🎬 艾莉丝的简介:QUdpSocket 封装 UDP 套接字描述符,基于 Qt 信号槽机制实现事件驱动 I/O,默认走非阻塞模型。QNetworkDatagram 表示一个完整 UDP 数据报,封装载荷数据、源/目的 IP 与源/目的端口。端口号为 16 位无符号整数,取值范围 0–65535,按 IANA 划分为四段。必须引入 network 模块,否则编译器无法定位 QUdpSocket 头文件。 引入模块后仍提示找不到头文件:执行 qmake 重新解析 .pro,触发工程重新构建。 2.0.2

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 495

Java:PriorityQueue详解——从零基础到应用

看了网上的详解,我反是一篇没看懂,都是什么垃圾玩意也发出来,无语,我自己根据这两天的学习总结出来了下面这些干货,我就是这么学会的,大家要是零基础看肯定木问题。

流楚丶格念的博客 6141

SPICE仿真软件:HSPICE_(22).HSPICE仿真案例分析

通过上述案例分析,我们可以看到HSPICE仿真软件在不同电路类型和仿真场景中的应用。无论是简单的直流分析、交流分析还是复杂的暂态分析,HSPICE都能提供详细的仿真结果,帮助我们更好地理解和优化电路设计。希望这些案例能够为读者提供实用的参考和指导,进一步提升使用HSPICE进行电路仿真的能力。输入文件的编写:确保输入文件格式正确,使用注释来解释每一部分的内容。分析类型的选择:根据电路的特点选择合适的分析类型,如.DC.AC和.TRAN。输出结果的设置:使用.print命令来指定需要输出的节点电压和支路电流。

kkchenjj的博客 1307

Windows/Linux下强实时运动控制内核(二):基于Qt的Delta机械手的开发应用

强实时运动控制内核MotionRT750下Qt开发Delta机械手的完整开发流程。

weixin_57350300的博客 241

23、变压器与电抗器知识详解

本文详细介绍了电力变压器的基本原理、等效电路、测试方法及多种运行方式,涵盖双绕组与自耦变压器的建模与应用。深入探讨了变压器极性判断、并联运行条件、电压调节技术,并扩展至非线性、磁滞、EMTP和高频模型,用于瞬态分析。同时阐述了地磁感应电流(GIC)的影响及对偶建模方法。最后系统介绍了各类电抗器的应用场景与特性,包括限流、无功补偿、滤波及特殊用途电抗器,全面覆盖电力系统中变压器与电抗器的核心知识。

eee77的博客 150

Qt信号与槽机(3)

Qt信号与槽机制支持多种连接方式:一对一(信号连槽或信号连信号)、一对多(一个信号连接多个槽)及多对一(多个信号连接同一槽)。通过connect()函数实现,如connect(sender, &A::sig, receiver, &B::slot)。一对一用于单一响应,一对多可触发多个操作,多对一则实现多源统一处理,灵活高效地构建事件驱动程序。

我的博客 221

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt信号与槽机(2)

Qt自定义信号与槽需遵循规范:信号在signals下声明,仅声明不实现;槽可位于public或全局作用域,需声明并实现。使用emit发送信号,关联须先于发射。支持参数传递与重载,参数类型和个数需匹配,信号参数可多于槽。通过教师上课、学生响应示例,演示类创建、信号槽声明、连接及触发流程,结合按钮事件实现动态联动,提升程序交互性。

我的博客 201

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Qt_05基础界面组件

Qt 基础界面组件

u012660296的博客 252

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【QT】系统相关:Qt网络编程概述

网络编程的底层接口来源于操作系统提供的Socket API,属于操作系统内核提供给应用层的系统调用接口,是应用程序访问TCP/IP协议栈的唯一入口。不同操作系统平台原生Socket API接口存在差异:Linux:遵循POSIX套接字标准,socket()、bind()、listen()、accept()、send()、recv(),文件描述符模型,一切皆文件;

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 290

QT(了解各个控件及布局)下

练习工程里加一个“确认发送”按钮点击后弹出一个自己写的对话框:一句提示 + “确定”/“取消”确定 → 打印“已确认”,继续发送;取消 → 打印“已取消”,不发送点窗口右上角 X = 取消对话框弹出期间,主窗口点不动(模态)首先我们要在原项目的基础上,新建一个类,就是一个新的小对话框窗口,如下:然后系统会帮我们创建这个新类的头文件和源文件,接着我们到利用ui编辑器设计这个新窗口的界面,如下:如果要实现文字居中,就要设置到QLabel的属性设置这个alignmen为水平中心对齐。

lhbweilai的博客 215

静态库导入Qt QCustomPlot第三方表格图形库

静态库 + .h文件。

qq_59167692的博客 26

兰亭妙微ui设计公司分享:Qt桌面界面怎样把状态和操作设计清楚

左侧显示设备列表,中间展示当前设备的运行数据,右侧提供启动和暂停。列表刚切换,详情还没更新时,也要让等待状态足够明确,避免用户拿上一台设备的数据判断当前情况。视觉上可以用稳定的位置帮助确认对象身份,把设备名称、连接状态和更新时间放在容易找到的区域。界面方案刚开始时,可以挑一个范围明确的场景与开发一起验证,例如选择设备、修改一个参数、提交并看到结果。空间收窄时,次要面板是否可以折叠,工具栏是否可以分组,主操作是否仍有固定位置,都需要有清楚的取舍。只能查看的用户,和可以修改参数的用户,看到的入口可能不同。

lanlanwork12的博客 181

Qt 实现复选框全选功能

【代码】Qt 实现复选框全选功能。

读书札记2022的博客 42

Qt 桌面程序按钮正常、语音播报时报 Qt6TextToSpeech.dll:部署与语音引擎分开查

一个 Qt 桌面程序的文本展示和按钮点击都正常,执行语音播报时却报 Qt6TextToSpeech.dll。先保留构建产物清单,用一句不含个人信息的测试文本复现。库文件缺失与系统没有可用语音引擎,是两个不同层次。 ## Qt6TextToSpeech.dll 在语音调用链中的具体作用 Qt TextToSpeech 模块提供应用访问语音合成引擎的接口,本身不

2301_78581598的博客 104

对于Qt:QDateTimeEdit常见属性以及QDateTime类的解析

本文详细介绍了Qt中的日期时间处理核心类(QDate、QTime、QDateTime)和日期时间编辑控件(QDateTimeEdit)的使用方法。主要内容包括: 三大基础类详解: QDate:处理年/月/日,提供日期创建、验证、计算和格式化功能 QTime:处理时/分/秒,支持时间运算和格式转换 QDateTime:组合日期和时间,支持时区转换和时间戳处理 QDateTimeEdit核心属性: dateTime/date/time:分别获取或设置完整日期时间、纯日期或纯时间 displayFormat:自定

2503_92929084的博客 204

QT元数据

在moc_todomodelviewmodel.cpp中qt_meta_stringdata_CLASSTodoModelViewModelENDCLASS(太长了,记作①),qt_meta_data_CLASSTodoModelViewModelENDCLASS(记作②)以及QMetaObject(③)是存放元数据的具体结构。QT作为一个流行的C++开发框架,保留了C++代码执行效率高的同时,也提供了类似动态语言的反射机制,能够实现很多原生c++不能做到的事情,这些要归功于QT moc出来的元数据。

yuanshenqiang的博客 191

Qt窗口:菜单栏、菜单、菜单项、工具栏、状态栏、浮动窗口

菜单栏QMenuBar、菜单QMenu、菜单项QAction、addToolBar添加工具栏、setAllowedAreas或addToolBar的第一个参数设置停靠位置设置、setFloatable浮动性、setMovable移动性,状态栏不可移动(setStatusBar、showMessage临时消息、addWidget/addpermanentWidget),浮动窗口可以放一堆复杂的排版控件,工具栏适合放一些快速点击的快捷按钮

Wangshijie1015的博客 276

Qt QMainWindow 详解:菜单栏、工具栏与状态栏实战

的基础上,预置了一套标准布局:顶部菜单栏、四周可停靠区域、底部状态栏、中间中央部件。理解这套骨架,是写出一个「像样」的桌面应用的第一步。它足够简单,但当你真正要做一个桌面软件时,很快就会发现缺东西:菜单放哪?描述「一个可执行的操作」,它可以同时出现在菜单、工具栏、右键菜单里,共享同一份状态和同一个信号。是助记符,按下 Alt 后会显示下划线,Alt+S 可直接触发。把前面三块拼起来,做一个能统计字符数、行数、单词数的小工具。这是编辑器类应用的经典需求。搜索框、字号选择、颜色按钮,都是工具栏的常见成员。

sijianiao110的博客 216
上一篇: 基于C#WPF实现的内存加速球清理类似360加速球内存清理
下一篇: 基于C#winform部署异常检测框anomalib的onnx模型
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值