📥 下载 macOS 应用: Releases
ExifGeek 是一个基于 ExifTool 的 macOS 桌面工具,专注于一个高频工作流:
- 从一张「源图片」中提取完整 EXIF / 元数据
- 将这些元数据批量注入到一张或多张「目标图片」中
界面采用 Dracula 暗色主题与极客风代码排版,底部操作区类似终端里的「编译面板」。
版权:@JhihHe
ExifTool 仍遵循其原有授权协议。
- 双面板工作流
- 左侧:源图片、EXIF 预览、复制 / 导出操作
- 右侧:目标图片列表
- 完整 EXIF 复制
- 调用 ExifTool:
-TagsFromFile -all:all -overwrite_original - 支持:单文件、多文件、整文件夹(递归)
- 调用 ExifTool:
- 拖拽支持
- 将文件从 Finder 拖到左侧「源图片」区域
- 将文件或文件夹拖到右侧「目标图片」区域
- 中英文界面切换
- 左上角
中文 / English按钮一键切换 - 所有文字(标题、按钮、状态栏提示)都会更新
- 左上角
- Dracula 极客风 UI
- 半透明「毛玻璃」暗色背景
- 等宽字体代码排版
- EXIF 预览区域带「代码高亮」效果
- 目标路径列表中目录 / 文件名 / 后缀分色显示
- EXIF 工具按钮
- 复制:将 EXIF JSON 复制到剪贴板
- 导出 TXT:将 EXIF JSON 导出为
.txt文本文件
- Python 3
- PyQt6 – GUI 框架
- ExifTool – 元数据引擎(随应用打包)
- py2app – 打包为 macOS
.app
主要文件和目录:
main.py– PyQt6 主程序,包含拖拽逻辑、EXIF 读写、中英文切换等setup.py– 使用 py2app 构建ExifGeek.app的配置exiftool_src/– 打包进应用的 ExifTool 目录icon.icns– Dracula 风格应用图标dist/ExifGeek.app– 最新构建的最终版应用dist/ExifGeek_prev.app– 上一版 UI 的备份构建
-
克隆仓库
git clone <your-repo-url> cd trae_exiftoolGUImac
-
创建并激活虚拟环境
python3 -m venv venv source venv/bin/activate -
安装依赖
pip install -r requirements.txt
典型依赖(仅供参考):
pyqt6py2apppillow(用于生成图标,可选)
在项目根目录执行:
source venv/bin/activate
python3 main.py直接以 PyQt6 窗口形式运行应用,而不是 .app。
使用 py2app 构建 dist/ExifGeek.app:
source venv/bin/activate
python3 setup.py py2app说明:
setup.py已配置:- 将
exiftool_src打包进应用资源目录 - 使用
icon.icns作为图标 - 将版权信息设置为
@JhihHe
- 将
- 运行时,应用会优先在打包资源中寻找 ExifTool:
- 若存在
RESOURCEPATH/exiftool_src/exiftool,则使用perl exiftool - 否则回退到系统 PATH 中的
exiftool
- 若存在
- 左上角按钮:
中文– 中文界面English– 英文界面
- 将文件拖到左侧「源图片」虚线框区域,或点击该区域从文件对话框中选择。
- 选择后:
- 调用 ExifTool 使用
-j输出 JSON - 左侧文本框中显示带颜色的 EXIF 代码风视图
- 调用 ExifTool 使用
此时可以:
- 复制 – 将 EXIF JSON 复制到剪贴板
- 导出 TXT – 将 EXIF JSON 保存为
.txt文本文件
- 将文件或文件夹拖到右侧「目标图片」区域:
- 若拖入文件夹,会递归遍历其中文件
- 会忽略以
.开头的隐藏文件
- 右侧列表中显示彩色路径:
- 目录:偏灰蓝色(类似注释)
- 文件名:绿色
- 后缀名:紫色
- 当存在源图片且目标列表不为空时,底部
>>> 注入元数据 >>>按钮会变为可用状态。 - 点击后:
-
对每个目标依次执行:
-TagsFromFile <source> -all:all -overwrite_original <target>
-
右下角状态栏会显示「处理中...」以及最终统计(成功 / 总数)
-
- 点击 清空所有:
- 重置源图片路径
- 清空 EXIF 预览内容
- 清空目标列表
- 禁用「注入元数据」按钮
应用内部使用一个简单的 key-value 翻译字典:
main.py中的TRANSLATIONS包含en和zh两套文本。- 界面上的文案统一通过
self.tr(key)读取,根据self.curr_lang决定语言。 - 顶部语言按钮会调用
change_language('en' | 'zh'):- 更新当前语言
- 刷新标题、按钮文本、拖拽提示、状态栏等所有文案
如需增加其它语言:
- 在
TRANSLATIONS中新增一个语言配置(例如ja)。 - 增加一个对应的切换按钮,并接入
change_language。
- 从 ExifTool 得到的原始 JSON 会存入
self.current_meta,用于:- 复制到剪贴板
- 导出 TXT 文件
- 左侧预览区域使用 HTML + 内联样式:
- 字段名和字段值使用不同颜色
- 数字、列表、字典等类型使用不同配色
- 整体保持等宽字体、接近代码高亮的观感
- 没有逐文件的进度条,仅提供简单的总数统计。
- 使用
-overwrite_original,不会生成_original备份文件,也就没有「撤销」。 - 详细错误信息打印在控制台,界面只提示成功统计。
- ExifGeek 源码:© @JhihHe,保留所有权利。
- ExifTool:版权和许可归 Phil Harvey 及贡献者所有,
详情见其官方仓库:https://github.com/exiftool/exiftool
如需反馈或功能建议,可以在 GitHub 仓库提交 Issue,或直接联系 @JhihHe。
