我做了一个 AI 图片重命名工具:看懂照片内容,再生成有意义的文件名
整理旅行照片时,我经常遇到一个问题:相机和手机生成的文件名通常是 IMG_8428.JPG IMG_0698.JPG 这样的编号。
当照片数量较少时,还可以逐张打开查看;但一次旅行拍摄几十甚至几百张照片后,仅凭文件名几乎无法知道照片内容。想找到“国清寺古建筑”“天台山瀑布合影”或者“琼台仙谷悬索桥”,只能不断翻看缩略图。
为了解决这个问题,我开发了一个带图形界面的 Python 工具:AI 照片与视频重命名器。
它可以调用本地视觉模型识别照片内容,自动生成类似下面这样的文件名:
IMG_0506.JPG
→ 20260812-天台山大瀑布景区-一家三口合影.JPG
IMG_8428.JPG
→ 20260813-国清寺-黄墙古树与石狮.JPG
IMG_8422.JPG
→ 20260812-琼台仙谷-悬索桥近景.JPG
相比没有含义的相机编号,这样的名称更容易搜索、归档和长期保存。
视频演示
这个工具能做什么?
工具使用 Python 和 Tkinter 开发,提供了一个简单的桌面操作界面。用户不需要编写命令,只需要选择照片目录、配置模型,然后按照“扫描—分析—预览—确认”的流程操作。
目前支持以下功能:
-
选择指定的图片目录
-
可选择是否递归扫描子目录
-
支持 JPG、JPEG、PNG、WebP 和 BMP 图片
-
支持 MOV、MP4、M4V、AVI 和 MKV 视频
-
自定义视觉模型名称和 API 地址
-
调用 Ollama 兼容接口分析图片内容
-
自动生成带日期和场景描述的文件名
-
重命名前预览全部结果
-
支持手工修改 AI 生成的名称
-
自动清理 Windows 文件名中的非法字符
-
自动处理同名文件并添加序号
-
不覆盖目录中已经存在的文件
-
批量重命名失败时尝试回滚
整个过程只会修改文件名,不会修改图片、视频内容或照片中的 EXIF 信息。
为什么选择本地视觉模型?
这款工具默认连接本机运行的 Ollama 服务,例如:
LLM_MODEL=qwen3.8:27b
LLM_API_HOST=http://127.0.0.1:11434
使用本地模型有两个主要好处。
1. 照片不需要上传到第三方平台
当 API 地址配置为 127.0.0.1 时,图片分析请求只发送给本机运行的模型服务。家庭照片、旅行合影等内容不需要上传到外部云服务。
当然,程序也允许修改 API 地址。如果使用远程服务,需要自行确认服务的隐私政策和数据处理方式。
2. 模型可以自由切换
模型名称和 API 地址都可以在 .env 文件或图形界面中配置,因此程序不依赖某一个固定模型。
需要注意的是,所选模型必须支持视觉输入。纯文本模型无法识别照片内容。
图片和视频是怎样处理的?
直接把数 MB 甚至十几 MB 的原图发送给模型,会占用较多内存和视觉 Token。为此,程序会先对图片进行预处理:
-
读取并修正照片的 EXIF 方向;
-
将图片最长边缩小到 1280 像素;
-
转换为适合模型分析的 JPEG 数据;
-
调用视觉模型生成文件名描述。
这个过程只在内存中生成缩略图,不会修改原始照片。
对于视频,程序会通过 FFmpeg 获取视频时长,抽取中间位置的一帧,然后让视觉模型根据这一帧生成名称。临时画面会在分析结束后自动删除。
这种方案无法概括长视频的全部内容,但对于手机拍摄的短视频、Live Photo 片段和旅行记录,通常已经能够提供有意义的名称。
为什么不让 AI 直接修改文件?
AI 生成的名称并不一定每次都完全准确。例如,它可能无法确定具体景点,或者把人物关系描述得过于笼统。
因此,这个工具没有采用“分析后立即重命名”的方式,而是加入了一个预览确认流程:
-
扫描目录中的媒体文件;
-
AI 逐个分析并生成建议名称;
-
用户检查全部结果;
-
对不满意的名称进行手工修改;
-
最后统一确认并应用。
只有用户点击“应用重命名”并再次确认后,程序才会真正修改文件名。
文件安全方面做了哪些处理?
批量重命名看起来简单,但需要考虑文件重名、非法字符和中途失败等情况。
程序会自动清理 Windows 不允许出现在文件名中的字符:
< > : " / \ | ? *
如果多个文件得到相同的名称,程序会自动添加序号:
天台山大瀑布-瀑布近景.JPG
天台山大瀑布-瀑布近景-02.JPG
天台山大瀑布-瀑布近景-03.JPG
正式重命名前,程序还会检查目标文件是否已经存在,避免覆盖原有文件。
批量操作采用两阶段重命名:文件首先被改成唯一的临时名称,确认全部进入临时状态后,再转换成最终名称。如果过程中发生异常,程序会尽可能恢复原始文件名。
安装和运行
项目使用独立的 Python 虚拟环境,不会把依赖安装到系统 Python 中。
进入项目目录后运行:
powershell -ExecutionPolicy Bypass -File .\setup.ps1
安装脚本会自动:
-
创建
.venv -
安装锁定版本的 Python 依赖
-
在缺少
.env时从模板创建配置文件
然后编辑 .env:
LLM_MODEL=qwen3.8:27b
LLM_API_HOST=http://127.0.0.1:11434
启动程序:
powershell -ExecutionPolicy Bypass -File .\run.ps1
run.ps1 会始终使用项目目录下 .venv 中的 Python。如果虚拟环境不存在,它会先自动执行安装脚本。
使用流程
实际操作只需要几步:
-
点击“选择目录”,指定待处理的照片目录;
-
配置 API 地址和视觉模型;
-
点击“测试连接”;
-
点击“扫描目录”;
-
点击“AI 分析全部”;
-
检查并修改建议名称;
-
点击“应用重命名”。
分析过程采用顺序处理,不会同时把大量原图加载到内存中,更适合包含几十或几百张照片的目录。
当前版本的局限
目前版本仍有一些可以继续改进的地方:
-
日期前缀暂时来自文件修改时间,还没有优先读取 EXIF 拍摄时间;
-
视频只分析中间一帧,无法完整理解长视频内容;
-
景点识别依赖视觉模型自身能力,模型可能只能描述画面而无法判断准确地点;
-
目前主要针对 Ollama 原生接口,还没有加入 OpenAI 兼容接口切换;
-
AI 生成的名称仍建议在应用前人工检查。
未来可以继续增加 EXIF 拍摄时间、地理位置、多个视频关键帧、命名模板以及重复照片检测等功能。
项目源码
完整源码和安装说明已发布在 GitHub:
如果你也有大量使用 IMG_XXXX.JPG 命名的旅行照片,希望这个工具能帮助你更高效地完成整理。