基于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),主要步骤为:
-
使用
PIL.Image.open()打开 HEIC 文件; -
若启用"保留元数据"选项,通过
img._getexif()读取 EXIF 信息(包含拍摄时间、相机型号、GPS 等); -
调用
img.convert('RGB')将图像转换为 RGB 色彩模式(JPEG 不支持透明通道); -
使用
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 及以上
-
依赖库 :
| 库名 | 用途 |
|---|---|
| PyQt5 | GUI 框架 |
| Pillow (PIL) | 图像处理 |
| pillow_heif | HEIC/HEIF 格式解码 |
安装步骤
-
安装 Python :从官方地址下载并安装 Python 3.8+,安装时勾选 “Add Python to PATH”。
-
打开命令行 ,切换到项目目录:
cd c:\Users\Administrator\Downloads\data -
(可选)创建虚拟环境 :
python -m venv venv venv\Scripts\activate -
安装依赖 :
pip install PyQt5 Pillow pillow_heif
运行步骤
-
确保已完成上述安装步骤。
-
在项目目录下执行:
python heicconvert.py -
程序启动后的操作流程:
-
添加文件 :点击"选择文件"或"选择文件夹"按钮,或直接将 HEIC 文件拖拽到列表区域;
-
(可选)批量重命名 :在"批量重命名"区域选择命名模式、填写前缀、设置起始序号,点击"预览"查看效果;
-
设置输出 :选择输出目录,调整 JPG 质量,按需勾选"保留元数据"“覆盖已存在文件”“自动创建日期子文件夹”;
-
开始转换 :点击"开始转换"按钮,在弹出的确认对话框中点击"Yes"开始;
-
查看结果 :转换完成后可在弹出的对话框中点击"打开文件夹"快速定位输出文件。
-
注意事项
-
操作系统限制 :代码中的
os.startfile()仅适用于 Windows,在 macOS/Linux 上点击"打开文件夹"会报错,需改用subprocess.call(['open', path])或xdg-open。 -
HEIC 解码依赖 :
pillow_heif依赖底层 libheif 库,若安装失败,可尝试升级 pip 后重新安装,或从 其官方仓库 获取帮助。 -
元数据保留 :仅当原图包含 EXIF 数据且勾选"保留元数据"时才会写入;部分 HEIC 文件可能不含 EXIF,此属正常现象。
-
质量与体积 :JPG 质量越高,输出文件越大。一般建议 85-95 即可兼顾质量与体积。
-
覆盖文件不可恢复 :勾选"覆盖已存在文件"后,同名原 JPG 将被直接覆盖且无法撤销,请谨慎使用。
-
子文件夹命名规则 :勾选"自动创建日期子文件夹"后,会在输出目录下创建形如
HEIC转换_YYYYMMDD_HHMMSS的子文件夹,用于区分不同批次的转换结果。 -
转换过程中请勿关闭程序 :转换进行时"开始转换"按钮会变为禁用状态,若强制关闭窗口可能导致部分文件未完成转换。
-
去重逻辑 :同一文件不会被重复添加到列表中,但若通过不同路径访问(如软链接)可能被识别为不同文件。
文件夹结构
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.csdn.net/download/FL1623863129/90010568

23

被折叠的 条评论
为什么被折叠?



