本项目是基于开源项目 semi-utils 迁移而来的PyQt5 GUI版本。原项目是一个命令行图片处理工具,主要用于为照片添加水印、阴影、白边等效果,支持多种布局和自定义设置。
原项目信息:
- 项目名称:Semi-Utils
- 作者:leslievan
- 开源协议:Apache 2.0 License
- 项目介绍:https://www.bilibili.com/video/BV11A411U7Kn
- 项目地址:https://github.com/leslievan/semi-utils
- 项目介绍(博客):https://lsvm.xyz/2023/02/semi-utils-intro/
- 从命令行迁移到图形界面:将原有的命令行交互模式完全替换为PyQt5图形用户界面
- 单界面设计:左侧参数设置,右侧文件选择、处理控制与统计(v2.2 起合并原有三个标签页)
- 实时配置预览:所有设置更改实时生效,无需手动保存
- 多线程处理:图片处理在后台线程进行,界面保持响应
- 进度显示:实时显示处理进度和状态信息
- 错误处理:完善的错误提示和日志记录机制
- 文件选择:图形化的目录选择对话框
- 模块化结构:将核心功能模块迁移到
core/entity和core/enums目录 - 配置管理:统一的配置管理系统
- 处理器链:灵活的图片处理器链设计
- 操作系统:Windows 7/8/10/11
- Python版本:Python 3.10+
- 依赖包:详见
requirements.txt
pip install -r requirements.txt程序内置基于 Pillow 的 EXIF 读取,不安装也能正常显示相机型号、拍摄参数、日期等信息。 程序启动时会自动检测,若未检测到 exiftool 会询问是否自动下载(仅 Windows)。 部分单反(如 Nikon D810)将 ISO 和镜头信息存放在 Makernotes 中,若需完整读取这些字段,可从exiftool官网下载:
- 将解压后的
exiftool(-k).exe文件复制到项目根目录下 - 将"exiftool(-k).exe"重命名为"exiftool.exe"
python main.py- 需要 Python 3.10+ 版本(代码使用了
dict | None等新语法) - 如遇到QFluentWidgets安装问题,可以尝试:
pip install PyQt-Fluent-Widgets - 确保系统已安装Microsoft Visual C++ Redistributable
在 Releases 页面下载 Copyleft-<版本>-windows-x64.zip,解压后双击 Copyleft.exe 即可运行,无需安装 Python。首次启动会自动在 exe 同目录释放配置、字体和相机 Logo;exiftool 会在需要时自动下载。
推送 v* 格式的 tag 即可自动构建并发布 Release(见 .github/workflows/release.yml):
git tag v2.6.0
git push origin v2.6.0GitHub Actions 会在 windows-latest 上用 PyInstaller 打包,产物 Copyleft-<tag>-windows-x64.zip 自动附到 Release。也可以在仓库的 Actions 页面手动触发(workflow_dispatch)做测试构建(不发布)。
程序为单界面设计:左侧为设置面板,右侧为处理面板。
- 布局类型:选择图片处理布局(水印、正方形、背景模糊等)
- Logo启用:控制是否在图片上添加Logo
- 四个角落文字:分别设置左上、右上、左下、右下角的文字内容
- 支持的文字类型:相机型号、镜头信息、拍摄参数、日期时间、自定义文字等
- 自定义文字:当下方某处文字选择"自定义"时,显示在此输入框中填写的内容
- 阴影效果:为图片添加阴影效果
- 白边效果:为图片添加白色边框
- 按比例填充:保持原始图片比例进行填充
- 等效焦距:使用等效焦距信息
- 图片质量:设置输出图片的质量(1-100)
- 输入目录:选择包含待处理图片的目录
- 输出目录:选择处理后的图片保存目录
- 开始处理:启动图片处理流程
- 停止:停止处理(已在处理中的图片会处理完)
- 进度显示:实时显示处理进度
- 实时显示排队数、正在处理数、已处理数和每秒处理数
- 水印布局:带Logo的水印布局
- 正方形布局:正方形裁剪布局
- 简单布局:基本处理布局
- 背景模糊:背景模糊效果
- 纯白边框:纯白色边框布局
- 相机型号
- 相机品牌
- 镜头信息
- 拍摄参数
- 日期时间
- 自定义文字
- 地理位置信息
- 文件名
- 无文字
- 阴影效果:为图片添加逼真的阴影
- 白边效果:添加白色边框增强视觉效果
- 比例保持:保持原始图片比例
- 高质量输出:可调节的输出质量
- 支持常见的图片格式(JPG、PNG等)
- 建议使用高质量原始图片
- 处理前请备份重要图片
- 输出目录会自动创建
- 处理后的图片会保持原文件名
- 建议使用空目录作为输出目录
- 大量图片处理可能需要较长时间
- 建议分批处理大量图片
- 处理过程中不要关闭程序
- 处理失败的文件会在日志中显示错误信息
- 单个文件处理失败不会影响其他文件
- 建议检查错误日志进行问题排查
问题:ImportError: DLL load failed
解决方案:安装Microsoft Visual C++ Redistributable
问题:界面字体过小
解决方案:程序已优化字体大小,如仍有问题可手动调整配置文件中的font_size和bold_font_size值
问题:多标签页操作复杂 解决方案:v2.2版本已合并为一个界面,左侧设置,右侧处理,操作更直观
问题:日志区域占用空间,信息不直观 解决方案:v2.2版本已删除日志显示,改为错误弹窗提示,界面更简洁
- core/entity:实体类定义(图片容器、处理器链等)
- core/enums:枚举常量定义
- main.py:PyQt5主窗口界面与处理线程
- utils:工具函数
采用责任链模式,支持灵活添加各种图片处理器:
- 阴影处理器
- 水印处理器
- 白边处理器
- 比例填充处理器
Copyleft/
├── core/ # 核心模块
│ ├── entity/ # 实体类(图片容器、处理器链、配置管理等)
│ └── enums/ # 枚举常量
├── fonts/ # 字体资源文件
├── logos/ # Logo图片资源
├── assets/ # 界面用图片资源(打赏二维码等)
├── config.yaml # 主配置文件
├── main.py # 程序入口点(整合了PyQt5主窗口界面)
├── init.py # 初始化配置、布局与处理器注册
├── utils.py # 工具函数库
└── requirements.txt # Python依赖包列表
- 添加新的布局类型:在
init.py中定义新的LayoutItem - 添加新的处理器:继承
ImageProcessor基类 - 修改界面:编辑
main.py中的MainWindow类
- PiggyWu981
- GitHub:@PiggyWu981
- Bilibili:@PiggyWu981
如果这个项目对你有帮助,欢迎通过给我们买杯咖啡支持我们的工作!
- ⭐ Star 这个项目
- 📝 提交 Issue 或 Pull Request
- 📢 分享给更多有需要的人
- EXIF 读取双通道:优先 exiftool(可读取 Makernotes 中的 ISO、镜头信息),缺失或失败时自动回退 Pillow 解析,不再强依赖 exiftool
- 启动时检测 exiftool,缺失时询问并自动下载安装
- 拍摄方向自动摆正(EXIF Orientation),竖拍照片输出不再横竖颠倒
- 拍摄时间缺失时回退为文件修改时间
- 修复浏览按钮因缺少配置方法而崩溃的问题;修复空 Logo id 误匹配所有厂商的问题
- 新增停止处理按钮;单张图片失败不再中断整体流程,错误统一弹窗汇总
- 支持打包为单文件 exe,新增 GitHub Actions 自动发布:推送 v* 标签即自动构建并发布 Release
- 优化界面布局和用户体验,改进设置项的组织结构
- 增强配置管理功能,支持更多自定义选项
- 修复已知bug,提升程序稳定性和性能
- 改进错误处理机制,提供更详细的错误信息
- 添加并行处理功能:支持同时处理最多5张图片,大大提高了程序运行效率
- 优化资源利用率:使用线程池管理工作线程,充分利用系统资源
- 改进错误处理机制:单个图片处理失败不会影响整体处理流程
- 添加进度显示功能,包括进度条和详细统计信息
- 在处理界面右下角新增处理统计区域
- 显示内容包括:排队数、正在处理数、已处理数和每秒处理数
- 简化UI界面,合并三个标签页为一个
- 删除日志显示,改为错误弹窗提示
- 优化界面布局,左侧设置,右侧处理
- 提升用户体验和操作效率
- 修复布局切换和文字位置设置的bug
- 优化字体大小显示效果
- 改进配置管理系统
- 增强错误处理和稳定性
- 完成PyQt5 GUI迁移
- 实现图形化用户界面
- 添加多线程处理支持
- 完善错误处理机制
- 命令行交互模式
- 基本图片处理功能
- 配置管理系统
