简介:这是一款面向摄影爱好者、普通用户及轻办公人群的照片视频智能分类工具,专注解决海量多媒体文件杂乱、整理耗时的痛点。软件通过控制面板的浏览或扫描功能选定目标资源,再勾选分类规则即可启动分拣,支持按分辨率(含1920x1080、3840x2160等自定义类别)、文件大小(可设1MB、5MB、10MB等阈值)、颜色属性、拍摄日期(精度可选年、年月、年月日)、曝光设置、文件格式、拍摄设备、图像方向等多维度组合分类,分类过程实时显示进度,无需复杂配置即可上手。资源包共3个文件,包含1个Python主程序脚本、1个依赖清单和1个说明文档,压缩包约171.55MB,结构简洁便于直接运行与二次调整。目前已有205人学习下载。借助该工具,读者可快速实现按日期归档作品、按格式整理素材等精细化操作,有效提升个人及轻办公场景下的多媒体资源管理效率。
1. 照片视频智能分类软件:按日期、分辨率、大小分堆的落地解法
手机相册里躺着两万张照片、几百段视频,想按年份归档、按分辨率挑出 4K 素材、按体积揪出占空间的大家伙,靠系统相册那点筛选功能基本是折磨。这套照片视频智能分类软件就是冲着这个场景来的:它把「按日期分类」拆成按年、年月、年月日三种精度,再叠加分辨率分类、文件大小分类、格式分类几条独立维度,让一堆散乱文件按规则自动落到对应文件夹。适合谁?做素材整理的剪辑师、要清手机空间的普通用户、需要按拍摄时间归档的项目资料管理员。它不修图、不剪辑,只干一件事——把文件按你定的规则分好堆,剩下的你自己接手。
2. 分类维度拆解:日期精度、分辨率档位、大小阈值怎么定
2.1 三种日期精度背后的目录结构差异
按日期分类听着简单,真正落地时第一个要拍板的是精度。按年分,目录就是2023/、2024/这种,适合长期冷归档,一个年份一个抽屉,找东西靠记忆年份。按年月分,变成2023-01/、2023-02/,颗粒度到月,适合旅行、项目这种有明确时间跨度的素材。按年月日分,2023-01-15/这种,颗粒度最细,适合每天产出量大的拍摄场景,比如婚礼跟拍、活动记录。
精度不是越高越好。年月日分完,你可能得到几百个只装三五张图的文件夹,翻起来反而累。我一般建议:手机日常照片用年月,专业拍摄按年月日,历史归档按年。软件把三种精度都做成可选项,切换时只改目录拼接规则,底层读取的拍摄时间字段不变。
拍摄时间从哪来?优先读 EXIF 里的DateTimeOriginal,没有就退到文件系统修改时间。这里有个坑:微信、QQ 保存的图片经常把 EXIF 洗掉,只剩文件时间,而文件时间可能是你保存那一刻,不是拍摄那一刻。所以分类前最好先扫一遍有多少文件缺 EXIF,心里有数。
2.2 分辨率分类的档位划分与判定逻辑
分辨率分类的核心是「按什么标准分档」。常见做法是按短边或长边像素值划区间,比如:
| 档位 | 判定条件(长边像素) | 典型来源 |
|---|---|---|
| 低清 | < 1280 | 老手机、压缩图 |
| 标清 | 1280 ~ 1919 | 1080P 截图、普通照片 |
| 高清 | 1920 ~ 3839 | 主流手机主摄 |
| 超清 | ≥ 3840 | 4K 视频帧、旗舰机 |
判定时要注意:视频的分辨率读的是元数据里的宽高,图片读的是像素尺寸,两者字段不同。软件内部一般用统一接口封装,对外只暴露「长边像素」一个值。横竖屏的问题也要处理——竖拍照片长边是高度,不能只读 width。
分档阈值建议做成可配置,不要写死。因为「高清」的定义因人而异,做短视频的可能把 1080 当低清,做文档扫描的觉得 200 万像素就够。配置文件里放一个阈值数组,改完重启生效,比重新编译省事。
2.3 文件大小与格式分类的阈值设置
文件大小分类最直接:设几个阈值,比如小于 1MB、1MB 到 10MB、大于 10MB,分到small/、medium/、large/。这个维度对清理空间特别有用——先按大小分完,直接看large/里哪些能删。
格式分类就是按扩展名分:jpg/、png/、heic/、mp4/、mov/各归各的。注意 HEIC 和 JPG 可能内容一样只是编码不同,分不分看你需求。如果要做格式转换,先按格式分好再批量转,比混在一起转稳。
多个维度同时启用时,目录结构会嵌套。比如「日期 + 分辨率」就是2023-01/高清/。嵌套层数别超过三层,否则路径太长,Windows 下容易撞 260 字符上限。软件一般提供「主维度 + 次维度」的选择,主维度放外层。
3. 动手跑一遍:从扫描到落盘的完整流程
3.1 环境准备与依赖安装
这类工具通常是 Python 写的,依赖 Pillow 读图片元数据、ffprobe 读视频信息。先确认环境:
# 检查 Python 版本,建议 3.9 以上 python3 --version # 安装核心依赖 pip install pillow exifread # 视频元数据依赖 ffprobe,确认已安装 ffprobe -versionpillow负责图片尺寸和基础 EXIF,exifread对拍摄时间字段的兼容性更好,两个都装上互补。ffprobe是 ffmpeg 套件的一部分,读视频分辨率、时长、创建时间都靠它。如果ffprobe没装,视频分类会直接跳过或报错,别等到跑完才发现视频一个没分。
3.2 扫描阶段:先出报告再动手
正式分类前,强烈建议先跑一次「只扫描不移动」的 dry-run。这一步输出一份清单:总文件数、缺 EXIF 的数量、各分辨率档位分布、各大小区间分布。
import os from PIL import Image from PIL.ExifTags import TAGS def scan_photo(path): """扫描单张图片,返回尺寸和拍摄时间""" info = {"path": path, "size": None, "shoot_time": None} try: with Image.open(path) as img: info["size"] = img.size # (width, height) exif = img.getexif() if exif: # 36867 是 DateTimeOriginal 的 tag 编号 shoot_time = exif.get(36867) info["shoot_time"] = shoot_time except Exception as e: info["error"] = str(e) return info这段代码的关键在exif.get(36867),36867 是 EXIF 标准里DateTimeOriginal的编号,格式是"2023:01:15 10:30:00",注意是冒号分隔日期,后面做目录名时要替换成短横线。img.size返回的宽高顺序固定是 (宽, 高),竖拍照片宽小于高,判定长边时取max()。
扫描结果里如果缺 EXIF 的比例超过三成,说明你的素材大量来自社交软件转发,这时候日期分类的准确性会打折扣,要么接受用文件时间,要么先手动补 EXIF。
3.3 分类执行:目录拼接与文件移动
扫描确认没问题后,进入实际分类。核心逻辑是「算目标路径 → 建目录 → 移动文件」。
import shutil from datetime import datetime def build_target_dir(base, shoot_time, resolution_tier, size_tier, mode="date"): """根据分类维度拼接目标目录""" if shoot_time: # EXIF 时间格式 2023:01:15 10:30:00 转 datetime dt = datetime.strptime(shoot_time, "%Y:%m:%d %H:%M:%S") else: dt = None parts = [base] if mode == "year" and dt: parts.append(dt.strftime("%Y")) elif mode == "month" and dt: parts.append(dt.strftime("%Y-%m")) elif mode == "day" and dt: parts.append(dt.strftime("%Y-%m-%d")) if resolution_tier: parts.append(resolution_tier) if size_tier: parts.append(size_tier) return os.path.join(*parts) def move_file(src, target_dir): """移动文件,目标存在同名时加序号""" os.makedirs(target_dir, exist_ok=True) filename = os.path.basename(src) dst = os.path.join(target_dir, filename) if os.path.exists(dst): name, ext = os.path.splitext(filename) dst = os.path.join(target_dir, f"{name}_1{ext}") shutil.move(src, dst)build_target_dir里mode参数控制日期精度,对应前面说的三种。resolution_tier和size_tier传空字符串就跳过该维度。move_file里的重名处理不能省——不同文件夹可能有同名文件,直接覆盖就是血泪教训。用shutil.move而不是os.rename,因为跨磁盘分区时 rename 会失败,move 会自动降级为复制加删除。
参数建议:base用绝对路径,别用相对路径,否则脚本换个目录跑就全乱。移动前先os.makedirs建目录,exist_ok=True避免重复建报错。
3.4 视频文件的特殊处理
视频不能直接用 Pillow 读,得走 ffprobe:
# 读取视频分辨率、创建时间、大小 ffprobe -v quiet -print_format json -show_format -show_streams input.mp4返回的 JSON 里,streams数组中codec_type为video的那一项,width和height就是分辨率。创建时间在format.tags.creation_time,格式是 ISO 8601,比 EXIF 好解析。但注意:很多手机拍的视频creation_time是 UTC 时间,和你本地时间差几个小时,跨天拍摄的可能被分到前一天。稳妥做法是读com.apple.quicktime.creationdate这个 tag,它带时区信息。
视频文件通常比图片大得多,移动耗时。建议视频分类单独跑,或者先按大小筛一遍,只处理超过阈值的。
4. 避坑与排查:分类跑歪了的五种典型情况
4.1 现象:所有文件都进了同一个文件夹
原因:EXIF 读取失败,shoot_time全是 None,日期维度直接跳过,只剩基础目录。解决:先跑扫描脚本看缺 EXIF 比例,确认是读取问题还是素材本身没有。如果是exifread和 Pillow 都没读到,试试exiftool命令行工具交叉验证,它支持的格式最全。
4.2 现象:日期分错,晚上拍的照片进了第二天
原因:EXIF 时间没有时区,视频的creation_time是 UTC。解决:图片按 EXIF 原样用,视频统一转成本地时区再分类。转换时用datetime.fromisoformat解析后加时区偏移,别用字符串截取。
4.3 现象:移动一半报错中断,文件散落两处
原因:某个文件被占用(正在预览、正在上传),shutil.move抛异常。解决:加 try-except 跳过单个失败文件,记录到failed.log,跑完统一处理。不要因为一个文件卡住整个批次。
4.4 现象:路径过长导致 Windows 报错
原因:嵌套层数太多,加上原文件名长,超过 260 字符。解决:控制嵌套不超过三层;或者开启 Windows 长路径支持;或者分类时截断原文件名,只保留前 50 字符加哈希后缀。
4.5 现象:HEIC 文件读不出尺寸
原因:Pillow 默认不支持 HEIC,需要pillow-heif插件。解决:pip install pillow-heif,然后在代码开头from pillow_heif import register_heif_opener; register_heif_opener()。不装的话 HEIC 会被当成损坏文件跳过。
5. 进阶技巧:用配置文件驱动多套分类方案
跑到后面你会发现,每次改阈值、改精度都去动代码太蠢。我后来的习惯是把所有规则抽到一个 YAML 里,脚本只读配置。
# config.yaml date_mode: month # year / month / day resolution: enabled: true tiers: - name: low max_long_edge: 1280 - name: hd max_long_edge: 1920 - name: uhd max_long_edge: 99999 size: enabled: true tiers: - name: small max_mb: 1 - name: medium max_mb: 10 - name: large max_mb: 999999读取时用yaml.safe_load,遍历 tiers 找第一个满足长边 <= max_long_edge的档位。这样换一套规则只改 YAML,代码不动。我一般会存三套配置:phone.yaml给手机照片用年月加大小分类,camera.yaml给相机素材用年月日加分辨率,archive.yaml给历史归档只用年。
验证分类结果对不对,别靠肉眼翻。写个校验脚本,统计每个目标目录的文件数,和扫描阶段的预期分布对比,偏差超过 5% 就说明有文件分错了。这个后悔药我每次大批量分类前都强制走一遍——先 dry-run 出预期,再实际跑,最后校验比对。三次对不上就停下来查,别硬跑。
希望帮到你。
本文还有配套的精品资源,点击获取